diff --git "a/doc/\351\233\206\346\210\220\346\226\207\346\241\243.pdf" "b/doc/\351\233\206\346\210\220\346\226\207\346\241\243.pdf" new file mode 100644 index 0000000000000000000000000000000000000000..6ae270090d5c0e28399c5ebb37903f4019e71d13 Binary files /dev/null and "b/doc/\351\233\206\346\210\220\346\226\207\346\241\243.pdf" differ diff --git a/example/basic-example/basic-example-main/pom.xml b/example/basic-example/basic-example-main/pom.xml index af9add2398431ae9583be18e6a69e32b486b0f33..2a61c257c8ebf717ea0ecf91ecf735df44f11e19 100644 --- a/example/basic-example/basic-example-main/pom.xml +++ b/example/basic-example/basic-example-main/pom.xml @@ -13,13 +13,13 @@ com.gitee.starblues basic-example-main - 2.1.4-RELEASE + 2.2.0-RELEASE jar 2.7.0 1.6 - 2.1.4-RELEASE + 2.2.0-RELEASE diff --git a/example/basic-example/basic-example-main/src/main/java/com/basic/example/main/config/ExamplePluginListener.java b/example/basic-example/basic-example-main/src/main/java/com/basic/example/main/config/ExamplePluginListener.java index 838cbdd5041bd07f6fe9c6aa8071f4c5f75668bf..9ee0a9aab494093e5f0c0e017f2c07230c8d6fe2 100644 --- a/example/basic-example/basic-example-main/src/main/java/com/basic/example/main/config/ExamplePluginListener.java +++ b/example/basic-example/basic-example-main/src/main/java/com/basic/example/main/config/ExamplePluginListener.java @@ -1,11 +1,10 @@ package com.basic.example.main.config; -import com.gitee.starblues.integration.PluginApplication; +import com.gitee.starblues.integration.application.PluginApplication; import com.gitee.starblues.integration.listener.PluginListener; import com.gitee.starblues.integration.user.PluginUser; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.stereotype.Component; /** 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 3c24ec22073856d388a605a72d2f21ce34af0bdc..f3f238fde3d8aafd6c8ad1c288bd9dd78386e1cb 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,10 +1,7 @@ package com.basic.example.main.config; -import com.gitee.starblues.integration.*; -import com.gitee.starblues.integration.initialize.AutoPluginInitializer; -import com.gitee.starblues.integration.initialize.PluginInitializer; -import org.pf4j.PluginException; -import org.pf4j.PluginManager; +import com.gitee.starblues.integration.application.PluginApplication; +import com.gitee.starblues.integration.application.AutoPluginApplication; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -17,40 +14,14 @@ import org.springframework.context.annotation.Configuration; @Configuration public class PluginBeanConfig { - /** - * 通过默认的集成工厂返回 PluginManager - * @param integrationConfiguration 集成的配置文件 - * @return - * @throws PluginException - */ - @Bean - public PluginManager pluginManager(IntegrationConfiguration integrationConfiguration) throws PluginException { - IntegrationFactory integrationFactory = new DefaultIntegrationFactory(); - return integrationFactory.getPluginManager(integrationConfiguration); - } /** - * 定义默认的插件应用。使用可以注入它操作插件。 - * @return + * 定义插件应用。使用可以注入它操作插件。 + * @return PluginApplication */ @Bean public PluginApplication pluginApplication(){ - DefaultPluginApplication defaultPluginApplication = new DefaultPluginApplication(); - defaultPluginApplication.addListener(ExamplePluginListener.class); - return defaultPluginApplication; - } - - /** - * 初始化插件。此处定义可以在系统启动时自动加载插件。 - * 如果想手动加载插件, 则可以使用 com.plugin.development.integration.initialize.ManualPluginInitializer 来初始化插件。 - * @param pluginApplication - * @return - */ - @Bean - public PluginInitializer pluginInitializer(PluginApplication pluginApplication, - PluginListener pluginListener){ - AutoPluginInitializer autoPluginInitializer = new AutoPluginInitializer(pluginApplication); - autoPluginInitializer.setPluginInitializerListener(pluginListener); - return autoPluginInitializer; + // 实例化自动初始化插件的PluginApplication + return new AutoPluginApplication(); } } diff --git a/example/basic-example/basic-example-main/src/main/java/com/basic/example/main/plugin/ConsoleNameFactory.java b/example/basic-example/basic-example-main/src/main/java/com/basic/example/main/plugin/ConsoleNameFactory.java index 889b35f20917ec2da7a73459e304d9cc0aa77c57..8315a9e6a5421ea480166e261dbb243b70487cd9 100644 --- a/example/basic-example/basic-example-main/src/main/java/com/basic/example/main/plugin/ConsoleNameFactory.java +++ b/example/basic-example/basic-example-main/src/main/java/com/basic/example/main/plugin/ConsoleNameFactory.java @@ -1,6 +1,6 @@ package com.basic.example.main.plugin; -import com.gitee.starblues.integration.PluginApplication; +import com.gitee.starblues.integration.application.PluginApplication; import com.gitee.starblues.integration.refresh.AbstractPluginSpringBeanRefresh; import org.springframework.stereotype.Component; diff --git a/example/basic-example/basic-example-main/src/main/java/com/basic/example/main/plugin/Hello.java b/example/basic-example/basic-example-main/src/main/java/com/basic/example/main/plugin/Hello.java new file mode 100644 index 0000000000000000000000000000000000000000..197595b005e497bf72cde9573dedf65433447dab --- /dev/null +++ b/example/basic-example/basic-example-main/src/main/java/com/basic/example/main/plugin/Hello.java @@ -0,0 +1,16 @@ +package com.basic.example.main.plugin; + +import org.pf4j.ExtensionPoint; + +/** + * 测试非Spring管理的bean接口 + * 实现类需要使用 @Extension 注解 + * + * @author zhangzhuo + * @version 1.0 + */ +public interface Hello extends ExtensionPoint { + + String getName(); + +} diff --git a/example/basic-example/basic-example-main/src/main/java/com/basic/example/main/rest/HelloResource.java b/example/basic-example/basic-example-main/src/main/java/com/basic/example/main/rest/HelloResource.java index 2e28b81e127ef9f67b40acb9f922eb470548d994..37fd5e1bedbe1552ccfca3a8ffb0f023fbcff272 100644 --- a/example/basic-example/basic-example-main/src/main/java/com/basic/example/main/rest/HelloResource.java +++ b/example/basic-example/basic-example-main/src/main/java/com/basic/example/main/rest/HelloResource.java @@ -1,6 +1,7 @@ package com.basic.example.main.rest; -import com.gitee.starblues.integration.PluginApplication; +import com.basic.example.main.plugin.Hello; +import com.gitee.starblues.integration.application.PluginApplication; import com.gitee.starblues.integration.user.PluginUser; import com.basic.example.main.plugin.ConsoleName; import com.basic.example.main.plugin.ConsoleNameFactory; @@ -101,6 +102,28 @@ public class HelloResource { return getConsoleNames(stringBuffer, consoleNames); } + + /** + * 通过 插件id 获取指定的插件中的实现类 + * 打印实现接口 com.basic.demo.main.main.plugin.ConsoleName 的实现类 + * @return 返回所有实现 com.basic.demo.main.main.plugin.ConsoleName 接口的实现类的 name() 方法的输出 + */ + @GetMapping("/extensions") + public String hello(){ + + List hellos = pluginUser.getPluginExtensions(Hello.class); + if(hellos == null){ + return "Not impl Hello"; + } else { + StringBuffer stringBuffer = new StringBuffer("extensions impl :
"); + for (Hello hello : hellos) { + stringBuffer.append(hello.getName()) + .append("
"); + } + return stringBuffer.toString(); + } + } + /** * 调用接口 name() 方法,并拼接输出 * @param stringBuffer stringBuffer diff --git a/example/basic-example/basic-example-main/src/main/java/com/basic/example/main/rest/PluginResource.java b/example/basic-example/basic-example-main/src/main/java/com/basic/example/main/rest/PluginResource.java index bb54179c557fd847defaa937ae019c42c46fe01b..61a12206cae79e5f4aa5c12ac15a87aba67697a0 100644 --- a/example/basic-example/basic-example-main/src/main/java/com/basic/example/main/rest/PluginResource.java +++ b/example/basic-example/basic-example-main/src/main/java/com/basic/example/main/rest/PluginResource.java @@ -1,6 +1,6 @@ package com.basic.example.main.rest; -import com.gitee.starblues.integration.PluginApplication; +import com.gitee.starblues.integration.application.PluginApplication; import com.gitee.starblues.integration.operator.PluginOperator; import com.gitee.starblues.integration.operator.module.PluginInfo; import org.springframework.beans.factory.annotation.Autowired; @@ -27,7 +27,6 @@ public class PluginResource { public PluginResource(PluginApplication pluginApplication) { this.pluginOperator = pluginApplication.getPluginOperator(); } - /** * 获取插件信息 * @return 返回插件信息 @@ -60,8 +59,11 @@ public class PluginResource { @PostMapping("/stop/{id}") public String stop(@PathVariable("id") String id){ try { - pluginOperator.stop(id); - return "plugin '" + id +"' stop success"; + if(pluginOperator.stop(id)){ + return "plugin '" + id +"' stop success"; + } else { + return "plugin '" + id +"' stop failure"; + } } catch (Exception e) { e.printStackTrace(); return "plugin '" + id +"' stop failure. " + e.getMessage(); @@ -76,8 +78,11 @@ public class PluginResource { @PostMapping("/start/{id}") public String start(@PathVariable("id") String id){ try { - pluginOperator.start(id); - return "plugin '" + id +"' start success"; + if(pluginOperator.start(id)){ + return "plugin '" + id +"' start success"; + } else { + return "plugin '" + id +"' start failure"; + } } catch (Exception e) { e.printStackTrace(); return "plugin '" + id +"' start failure. " + e.getMessage(); @@ -93,8 +98,11 @@ public class PluginResource { @PostMapping("/uninstall/{id}") public String uninstall(@PathVariable("id") String id){ try { - pluginOperator.uninstall(id); - return "plugin '" + id +"' uninstall success"; + if(pluginOperator.uninstall(id, true)){ + return "plugin '" + id +"' uninstall success"; + } else { + return "plugin '" + id +"' uninstall failure"; + } } catch (Exception e) { e.printStackTrace(); return "plugin '" + id +"' uninstall failure. " + e.getMessage(); @@ -110,8 +118,11 @@ public class PluginResource { @PostMapping("/installByPath") public String install(@RequestParam("path") String path){ try { - pluginOperator.install(Paths.get(path)); - return "installByPath success"; + if(pluginOperator.install(Paths.get(path))){ + return "installByPath success"; + } else { + return "installByPath failure"; + } } catch (Exception e) { e.printStackTrace(); return "installByPath failure : " + e.getMessage(); @@ -127,8 +138,11 @@ public class PluginResource { @PostMapping("/uploadInstallPluginJar") public String install(@RequestParam("jarFile") MultipartFile multipartFile){ try { - pluginOperator.uploadPluginAndStart(multipartFile); - return "install success"; + if(pluginOperator.uploadPluginAndStart(multipartFile)){ + return "install success"; + } else { + return "install failure"; + } } catch (Exception e) { e.printStackTrace(); return "install failure : " + e.getMessage(); @@ -136,24 +150,6 @@ public class PluginResource { } - - /** - * 备份插件。注意: 该操作只适用于生产环境 - * @param pluginId 插件id - * @return 操作结果 - */ - @PostMapping("/back/{pluginId}") - public String backupPlugin(@PathVariable("pluginId") String pluginId){ - try { - pluginOperator.backupPlugin(pluginId, "testBack"); - return "backupPlugin success"; - } catch (Exception e) { - e.printStackTrace(); - return "backupPlugin failure : " + e.getMessage(); - } - } - - /** * 上传插件的配置文件。注意: 该操作只适用于生产环境 * @param multipartFile 上传文件 multipartFile @@ -162,27 +158,34 @@ public class PluginResource { @PostMapping("/uploadPluginConfigFile") public String uploadConfig(@RequestParam("configFile") MultipartFile multipartFile){ try { - pluginOperator.uploadConfigFile(multipartFile); - return "uploadPluginConfigFile success"; + if(pluginOperator.uploadConfigFile(multipartFile)){ + return "uploadConfig success"; + } else { + return "uploadConfig failure"; + } } catch (Exception e) { e.printStackTrace(); - return "uploadPluginConfigFile failure : " + e.getMessage(); + return "uploadConfig failure : " + e.getMessage(); } } + /** - * 通过路径安装配置文件。注意: 该操作只适用于生产环境 - * @param path 配置文件路径 + * 备份插件。注意: 该操作只适用于生产环境 + * @param pluginId 插件id * @return 操作结果 */ - @PostMapping("/installPluginConfig") - public String installPluginConfig(@RequestParam("path") String path){ + @PostMapping("/back/{pluginId}") + public String backupPlugin(@PathVariable("pluginId") String pluginId){ try { - pluginOperator.installConfigFile(Paths.get(path)); - return "installPluginConfig success"; + if(pluginOperator.backupPlugin(pluginId, "testBack")){ + return "backupPlugin success"; + } else { + return "backupPlugin failure"; + } } catch (Exception e) { e.printStackTrace(); - return "installPluginConfig failure : " + e.getMessage(); + return "backupPlugin failure : " + e.getMessage(); } } diff --git a/example/basic-example/basic-example-runner/pom.xml b/example/basic-example/basic-example-runner/pom.xml index 51509a9c065d60e4566eea1796ee587dd94b8100..0ac04aa9077192ec678e4e0fbd8220456ed86e1b 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.1.4-RELEASE + 2.2.0-RELEASE pom diff --git a/example/basic-example/plugins/basic-example-plugin1/plugin.properties b/example/basic-example/plugins/basic-example-plugin1/plugin.properties index d9ff7d8fa856bb0b5cc2377cf967358be8428155..5090ae723f3cd7ce3d5c4d51010cfe853f45db70 100644 --- a/example/basic-example/plugins/basic-example-plugin1/plugin.properties +++ b/example/basic-example/plugins/basic-example-plugin1/plugin.properties @@ -1,4 +1,4 @@ plugin.id=basic-example-plugin1 plugin.class=com.basic.example.plugin1.DefinePlugin -plugin.version=2.1.4-RELEASE +plugin.version=2.2.0-RELEASE plugin.provider=StarBlues \ 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 6343f5a9941aacd21ee2629715ec8b5efaea7fbb..b4c1ba2b72d350050cbe827013f003c0194ffced 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.1.4-RELEASE + 2.2.0-RELEASE ../pom.xml basic-example-plugin1 - 2.1.4-RELEASE + 2.2.0-RELEASE jar 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 4c45db835df9848434eca4b266760a9e5cf433e2..da0f380757daec5b0521f1de307a0d6829fa5a9e 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,7 +1,6 @@ package com.basic.example.plugin1; import com.gitee.starblues.realize.BasePlugin; -import org.pf4j.PluginException; import org.pf4j.PluginWrapper; /** @@ -16,12 +15,12 @@ public class DefinePlugin extends BasePlugin { } @Override - protected void startEvent() throws PluginException { + protected void startEvent() { } @Override - protected void deleteEvent() throws PluginException { + protected void deleteEvent() { } diff --git a/example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/service/HelloImp1.java b/example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/service/HelloImp1.java new file mode 100644 index 0000000000000000000000000000000000000000..ee3213be1a78549fa679d77a43a3f25ee0be2257 --- /dev/null +++ b/example/basic-example/plugins/basic-example-plugin1/src/main/java/com/basic/example/plugin1/service/HelloImp1.java @@ -0,0 +1,16 @@ +package com.basic.example.plugin1.service; + +import com.basic.example.main.plugin.Hello; + +/** + * description + * + * @author zhangzhuo + * @version 1.0 + */ +public class HelloImp1 implements Hello { + @Override + public String getName() { + return "my name is hello imp1 of plugin1"; + } +} diff --git a/example/basic-example/plugins/basic-example-plugin2/plugin.properties b/example/basic-example/plugins/basic-example-plugin2/plugin.properties index 96f2d22216fc662224d04cc36143b9a887c4e16e..43de2a715c92b0afa3fb1f1d8be3317599ddd154 100644 --- a/example/basic-example/plugins/basic-example-plugin2/plugin.properties +++ b/example/basic-example/plugins/basic-example-plugin2/plugin.properties @@ -1,4 +1,4 @@ plugin.id=basic-example-plugin2 plugin.class=com.basic.example.plugin2.DefinePlugin -plugin.version=2.1.4-RELEASE +plugin.version=2.2.0-RELEASE plugin.provider=StarBlues \ 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 a109b8ee7bcffde8b5c6e22d8658f37a96b79edf..becb8e7e9d1731a02a372148cea66f89a0870b03 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.1.4-RELEASE + 2.2.0-RELEASE ../pom.xml basic-example-plugin2 - 2.1.4-RELEASE + 2.2.0-RELEASE jar diff --git a/example/basic-example/plugins/basic-example-plugin2/src/main/java/com/basic/example/plugin2/DefinePlugin.java b/example/basic-example/plugins/basic-example-plugin2/src/main/java/com/basic/example/plugin2/DefinePlugin.java index 794445d6038a7e5355256b0f32bae2ab127b508d..98f258ba459ccd03ccf4c4f0c6cbc2166c16727d 100644 --- a/example/basic-example/plugins/basic-example-plugin2/src/main/java/com/basic/example/plugin2/DefinePlugin.java +++ b/example/basic-example/plugins/basic-example-plugin2/src/main/java/com/basic/example/plugin2/DefinePlugin.java @@ -1,7 +1,6 @@ package com.basic.example.plugin2; import com.gitee.starblues.realize.BasePlugin; -import org.pf4j.PluginException; import org.pf4j.PluginWrapper; /** @@ -16,12 +15,12 @@ public class DefinePlugin extends BasePlugin { } @Override - protected void startEvent() throws PluginException { + protected void startEvent() { } @Override - protected void deleteEvent() throws PluginException { + protected void deleteEvent() { } diff --git a/example/basic-example/plugins/pom.xml b/example/basic-example/plugins/pom.xml index 8b8e99ac414a29c4ebabaa236cd4c3e16383e198..25320c5082893decefd48e7f0cc4845445ba099e 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.1.4-RELEASE + 2.2.0-RELEASE pom diff --git a/example/basic-example/pom.xml b/example/basic-example/pom.xml index 07a3308b50ed65b8f073a50ede5eb1ed5133102a..7dfaf47f12e4505a38bd7024c9a3d480bf8ff010 100644 --- a/example/basic-example/pom.xml +++ b/example/basic-example/pom.xml @@ -6,7 +6,7 @@ com.gitee.starblues basic-example - 2.1.4-RELEASE + 2.2.0-RELEASE pom 基本案例 diff --git a/example/integration-mybatis/integration-mybatis-main/pom.xml b/example/integration-mybatis/integration-mybatis-main/pom.xml index 695dae300d91cd7fe5744f80a1f4405e01e03285..1c62e7d25264886fc81479d393de4aadeb07a64c 100644 --- a/example/integration-mybatis/integration-mybatis-main/pom.xml +++ b/example/integration-mybatis/integration-mybatis-main/pom.xml @@ -8,19 +8,19 @@ org.springframework.boot spring-boot-starter-parent - 2.0.3.RELEASE + 2.1.1.RELEASE com.gitee.starblues integration-mybatis-main - 2.1.4-RELEASE + 2.2.0-RELEASE jar 主程序模块 - 2.1.4-RELEASE - 2.1.4-RELEASE + 2.2.0-RELEASE + 2.2.0-RELEASE 2.0.1 2.7.0 1.6 @@ -85,7 +85,6 @@ ${swagger-bootstrap-ui.version} - org.springframework.boot spring-boot-starter-test @@ -102,6 +101,8 @@ spring-boot-maven-plugin + + repackage repackage diff --git a/example/integration-mybatis/integration-mybatis-main/src/main/java/com/mybatis/main/config/PluginBeanConfig.java b/example/integration-mybatis/integration-mybatis-main/src/main/java/com/mybatis/main/config/PluginBeanConfig.java index 2acb949abb78123b4d418c721e2ccbf176d22f29..853f2ec51bd4504f7aa8a68b979a42e4af759736 100644 --- a/example/integration-mybatis/integration-mybatis-main/src/main/java/com/mybatis/main/config/PluginBeanConfig.java +++ b/example/integration-mybatis/integration-mybatis-main/src/main/java/com/mybatis/main/config/PluginBeanConfig.java @@ -2,12 +2,13 @@ package com.mybatis.main.config; import com.gitee.starblues.extension.mybatis.SpringBootMybatisExtension; import com.gitee.starblues.integration.*; -import com.gitee.starblues.integration.initialize.AutoPluginInitializer; -import com.gitee.starblues.integration.initialize.PluginInitializer; -import org.pf4j.PluginException; -import org.pf4j.PluginManager; +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.context.annotation.Configuration; +import org.springframework.stereotype.Component; /** * @Description: 插件集成配置 @@ -17,42 +18,67 @@ import org.springframework.context.annotation.Configuration; * @Update Date Time: * @see */ -@Configuration +@Component +@ConfigurationProperties(prefix = "plugin") public class PluginBeanConfig { /** - * 通过默认的集成工厂返回 PluginManager - * @param integrationConfiguration 集成的配置文件 - * @return - * @throws PluginException + * 运行模式 + * 开发环境: development、dev + * 生产/部署 环境: deployment、prod */ - @Bean - public PluginManager pluginManager(IntegrationConfiguration integrationConfiguration) throws PluginException { - IntegrationFactory integrationFactory = new DefaultIntegrationFactory(); - return integrationFactory.getPluginManager(integrationConfiguration); - } + @Value("${runMode:dev}") + private String runMode; + + /** + * 插件的路径 + */ + @Value("${pluginPath:plugins}") + private String pluginPath; /** - * 定义默认的插件应用。使用可以注入它操作插件。 - * @return + * 插件文件的路径 */ + @Value("${pluginConfigFilePath:pluginConfigs}") + private String pluginConfigFilePath; + + + @Bean - public PluginApplication pluginApplication(){ - DefaultPluginApplication defaultPluginApplication = new DefaultPluginApplication(); - defaultPluginApplication.addExtension(new SpringBootMybatisExtension()); - return defaultPluginApplication; + public IntegrationConfiguration configuration(){ + return ConfigurationBuilder.toBuilder() + .runtimeMode(RuntimeMode.byName(runMode)) + .pluginPath(pluginPath) + .pluginConfigFilePath(pluginConfigFilePath) + .uploadTempPath("temp") + .backupPath("backupPlugin") + .pluginRestControllerPathPrefix("/api/plugin") + .enablePluginIdRestControllerPathPrefix(true) + .build(); } + /** - * 初始化插件。此处定义可以在系统启动时自动加载插件。 - * 如果想手动加载插件, 则可以使用 com.plugin.development.integration.initialize.ManualPluginInitializer 来初始化插件。 - * @param pluginApplication - * @return + * 定义插件应用。使用可以注入它操作插件。 + * @return PluginApplication */ @Bean - public PluginInitializer pluginInitializer(PluginApplication pluginApplication){ - AutoPluginInitializer autoPluginInitializer = new AutoPluginInitializer(pluginApplication); - return autoPluginInitializer; + public PluginApplication pluginApplication(){ + // 实例化自动初始化插件的PluginApplication + PluginApplication pluginApplication = new AutoPluginApplication(); + pluginApplication.addExtension(new SpringBootMybatisExtension()); + 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/example/integration-mybatis/integration-mybatis-main/src/main/java/com/mybatis/main/config/PluginConfiguration.java b/example/integration-mybatis/integration-mybatis-main/src/main/java/com/mybatis/main/config/PluginConfiguration.java deleted file mode 100644 index b6442d3e6baceecd1369879e11b55368dc069a66..0000000000000000000000000000000000000000 --- a/example/integration-mybatis/integration-mybatis-main/src/main/java/com/mybatis/main/config/PluginConfiguration.java +++ /dev/null @@ -1,128 +0,0 @@ -package com.mybatis.main.config; - -import com.gitee.starblues.integration.DefaultIntegrationConfiguration; -import org.pf4j.RuntimeMode; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.stereotype.Component; - - -/** - * @Description: - * @Author: zhangzhuo - * @Version: 1.0 - * @Create Date Time: 2019-05-25 12:36 - * @Update Date Time: - * @see - */ -@Component -@ConfigurationProperties(prefix = "plugin") -public class PluginConfiguration extends DefaultIntegrationConfiguration { - - /** - * 运行模式 - * 开发环境: development、dev - * 生产/部署 环境: deployment、prod - */ - @Value("${runMode:dev}") - private String runMode; - - /** - * 插件的路径 - */ - @Value("${pluginPath:plugins}") - private String pluginPath; - - /** - * 插件文件的路径 - */ - @Value("${pluginConfigFilePath:pluginConfigs}") - private String pluginConfigFilePath; - - - @Override - public RuntimeMode environment() { - return RuntimeMode.byName(runMode); - } - - @Override - public String pluginPath() { - return pluginPath; - } - - @Override - public String pluginConfigFilePath() { - return pluginConfigFilePath; - } - - /** - * 重写上传插件包的临时存储路径。只适用于生产环境 - * @return String - */ - @Override - public String uploadTempPath() { - return "temp"; - } - - /** - * 重写插件备份路径。只适用于生产环境 - * @return String - */ - @Override - public String backupPath() { - return "backupPlugin"; - } - - /** - * 重写插件RestController请求的路径前缀 - * @return String - */ - @Override - public String pluginRestControllerPathPrefix() { - return "/api/plugin"; - } - - /** - * 重写是否启用插件id作为RestController请求的路径前缀。 - * 启动则插件id会作为二级路径前缀。即: /api/plugin/pluginId/** - * @return String - */ - @Override - public boolean enablePluginIdRestControllerPathPrefix() { - return true; - } - - public String getRunMode() { - return runMode; - } - - public void setRunMode(String runMode) { - this.runMode = runMode; - } - - - public String getPluginPath() { - return pluginPath; - } - - public void setPluginPath(String pluginPath) { - this.pluginPath = pluginPath; - } - - public String getPluginConfigFilePath() { - return pluginConfigFilePath; - } - - public void setPluginConfigFilePath(String pluginConfigFilePath) { - this.pluginConfigFilePath = pluginConfigFilePath; - } - - @Override - public String toString() { - return "PluginArgConfiguration{" + - "runMode='" + runMode + '\'' + - ", pluginPath='" + pluginPath + '\'' + - ", pluginConfigFilePath='" + pluginConfigFilePath + '\'' + - '}'; - } -} diff --git a/example/integration-mybatis/integration-mybatis-main/src/main/java/com/mybatis/main/rest/PluginResource.java b/example/integration-mybatis/integration-mybatis-main/src/main/java/com/mybatis/main/rest/PluginResource.java index 917e33b7e1602db878046c457495fa781a745882..7b4e3f676c3fd8e2ca3556c6c68d08d1b38d1f6f 100644 --- a/example/integration-mybatis/integration-mybatis-main/src/main/java/com/mybatis/main/rest/PluginResource.java +++ b/example/integration-mybatis/integration-mybatis-main/src/main/java/com/mybatis/main/rest/PluginResource.java @@ -1,10 +1,9 @@ package com.mybatis.main.rest; -import com.gitee.starblues.integration.PluginApplication; +import com.gitee.starblues.integration.application.PluginApplication; import com.gitee.starblues.integration.operator.PluginOperator; import com.gitee.starblues.integration.operator.module.PluginInfo; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.ApplicationContext; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; @@ -61,8 +60,11 @@ public class PluginResource { @PostMapping("/stop/{id}") public String stop(@PathVariable("id") String id){ try { - pluginOperator.stop(id); - return "plugin '" + id +"' stop success"; + if(pluginOperator.stop(id)){ + return "plugin '" + id +"' stop success"; + } else { + return "plugin '" + id +"' stop failure"; + } } catch (Exception e) { e.printStackTrace(); return "plugin '" + id +"' stop failure. " + e.getMessage(); @@ -77,8 +79,11 @@ public class PluginResource { @PostMapping("/start/{id}") public String start(@PathVariable("id") String id){ try { - pluginOperator.start(id); - return "plugin '" + id +"' start success"; + if(pluginOperator.start(id)){ + return "plugin '" + id +"' start success"; + } else { + return "plugin '" + id +"' start failure"; + } } catch (Exception e) { e.printStackTrace(); return "plugin '" + id +"' start failure. " + e.getMessage(); @@ -94,8 +99,11 @@ public class PluginResource { @PostMapping("/uninstall/{id}") public String uninstall(@PathVariable("id") String id){ try { - pluginOperator.uninstall(id); - return "plugin '" + id +"' uninstall success"; + if(pluginOperator.uninstall(id, true)){ + return "plugin '" + id +"' uninstall success"; + } else { + return "plugin '" + id +"' uninstall failure"; + } } catch (Exception e) { e.printStackTrace(); return "plugin '" + id +"' uninstall failure. " + e.getMessage(); @@ -111,8 +119,11 @@ public class PluginResource { @PostMapping("/installByPath") public String install(@RequestParam("path") String path){ try { - pluginOperator.install(Paths.get(path)); - return "installByPath success"; + if(pluginOperator.install(Paths.get(path))){ + return "installByPath success"; + } else { + return "installByPath failure"; + } } catch (Exception e) { e.printStackTrace(); return "installByPath failure : " + e.getMessage(); @@ -128,8 +139,11 @@ public class PluginResource { @PostMapping("/uploadInstallPluginJar") public String install(@RequestParam("jarFile") MultipartFile multipartFile){ try { - pluginOperator.uploadPluginAndStart(multipartFile); - return "install success"; + if(pluginOperator.uploadPluginAndStart(multipartFile)){ + return "install success"; + } else { + return "install failure"; + } } catch (Exception e) { e.printStackTrace(); return "install failure : " + e.getMessage(); @@ -145,8 +159,11 @@ public class PluginResource { @PostMapping("/uploadPluginConfigFile") public String uploadConfig(@RequestParam("configFile") MultipartFile multipartFile){ try { - pluginOperator.uploadConfigFile(multipartFile); - return "uploadConfig success"; + if(pluginOperator.uploadConfigFile(multipartFile)){ + return "uploadConfig success"; + } else { + return "uploadConfig failure"; + } } catch (Exception e) { e.printStackTrace(); return "uploadConfig failure : " + e.getMessage(); @@ -162,8 +179,11 @@ public class PluginResource { @PostMapping("/back/{pluginId}") public String backupPlugin(@PathVariable("pluginId") String pluginId){ try { - pluginOperator.backupPlugin(pluginId, "testBack"); - return "backupPlugin success"; + if(pluginOperator.backupPlugin(pluginId, "testBack")){ + return "backupPlugin success"; + } else { + return "backupPlugin failure"; + } } catch (Exception e) { e.printStackTrace(); return "backupPlugin failure : " + e.getMessage(); diff --git a/example/integration-mybatis/integration-mybatis-main/src/main/resources/application-dev.yml b/example/integration-mybatis/integration-mybatis-main/src/main/resources/application-dev.yml index c4d75050be2ce6caeafa72ef920a7eee70d1a2ab..df5d62b644b490b9cb9475e56a22826d561b25e1 100644 --- a/example/integration-mybatis/integration-mybatis-main/src/main/resources/application-dev.yml +++ b/example/integration-mybatis/integration-mybatis-main/src/main/resources/application-dev.yml @@ -3,7 +3,7 @@ server: spring: datasource: - url: jdbc:mysql://127.0.0.1:3306/plugin?useUnicode=true&useSSL=false&characterEncoding=utf8 + url: jdbc:mysql://127.0.0.1:3306/plugin?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=UTC username: root password: 123456 driver-class-name: com.mysql.jdbc.Driver diff --git a/example/integration-mybatis/integration-mybatis-main/src/main/resources/application-prod.yml b/example/integration-mybatis/integration-mybatis-main/src/main/resources/application-prod.yml index eafc8bb1b2477fd4f00f55d640b1b1974f30f234..45b1f6e91655d17002fd2b0b2ed7de008d749b4f 100644 --- a/example/integration-mybatis/integration-mybatis-main/src/main/resources/application-prod.yml +++ b/example/integration-mybatis/integration-mybatis-main/src/main/resources/application-prod.yml @@ -3,7 +3,7 @@ server: spring: datasource: - url: jdbc:mysql://127.0.0.1:3306/plugin?useUnicode=true&useSSL=false&characterEncoding=utf8 + url: jdbc:mysql://127.0.0.1:3306/plugin?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=UTC username: root password: 123456 driver-class-name: com.mysql.jdbc.Driver diff --git a/example/integration-mybatis/integration-mybatis-plugin-parent/pom.xml b/example/integration-mybatis/integration-mybatis-plugin-parent/pom.xml index d15419e9c2cd802816f3e0f7d191d34cfb439675..a8bceb67969f87b6a7eaf471bc56ded3a909b19e 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.1.4-RELEASE + 2.2.0-RELEASE pom diff --git a/example/integration-mybatis/integration-mybatis-runner/pom.xml b/example/integration-mybatis/integration-mybatis-runner/pom.xml index 2f6131ab96d24e658f34ce11c1a5a70d7e3d9a07..66423b69d84adf7b0cfc073d3bcbd9efc9d615cc 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.1.4-RELEASE + 2.2.0-RELEASE jar 启动程序模块。将启动类配置到该模块下 diff --git a/example/integration-mybatis/plugins/integration-mybatis-plugin1/plugin.properties b/example/integration-mybatis/plugins/integration-mybatis-plugin1/plugin.properties index 99109b79d17592d0a4a7138021079b3db59519a7..c909a8dd37df247a60641c0bb1ce4cfd90fa282f 100644 --- a/example/integration-mybatis/plugins/integration-mybatis-plugin1/plugin.properties +++ b/example/integration-mybatis/plugins/integration-mybatis-plugin1/plugin.properties @@ -1,4 +1,4 @@ plugin.id=integration-mybatis-plugin1 plugin.class=com.mybatis.plugin1.ExamplePlugin1 -plugin.version=2.1.4-RELEASE +plugin.version=2.2.0-RELEASE plugin.provider=StarBlues \ No newline at end of file diff --git a/example/integration-mybatis/plugins/integration-mybatis-plugin1/pom.xml b/example/integration-mybatis/plugins/integration-mybatis-plugin1/pom.xml index af20f000186bd564d03b7d76e3f8c0b10c3036ac..a4bf654fb73687039674675556b9abf94cc97a2e 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.1.4-RELEASE - ../../integration-mybatis-plugin-parent + 2.2.0-RELEASE + ../../integration-mybatis-plugin-parent/pom.xml integration-mybatis-plugin1 - 2.1.4-RELEASE + 2.2.0-RELEASE jar 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 3e65cf4531383815f00815632022bce19e18ce38..d5416439dd65d8b38e7e5043c8be0c6a845cc4ab 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 @@ -2,7 +2,6 @@ package com.mybatis.plugin1; import com.gitee.starblues.extension.mybatis.configuration.SpringBootMybatisConfig; import com.gitee.starblues.realize.BasePlugin; -import org.pf4j.PluginException; import org.pf4j.PluginWrapper; import java.util.HashSet; @@ -25,12 +24,12 @@ public class ExamplePlugin1 extends BasePlugin implements SpringBootMybatisConfi } @Override - protected void startEvent() throws PluginException { + protected void startEvent() { } @Override - protected void deleteEvent() throws PluginException { + protected void deleteEvent() { } diff --git a/example/integration-mybatis/plugins/integration-mybatis-plugin2/plugin.properties b/example/integration-mybatis/plugins/integration-mybatis-plugin2/plugin.properties index f65a59d2c73bb5546e20c25df84c3ca212ef8d36..e1aa8308750a8d431f77601518aa3e919f4a8f47 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.1.4-RELEASE +plugin.version=2.2.0-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 dd08cc324cf4192fe417a424b730e90728727ba0..9389e189ad30836e06df7222c708fee17831b1fc 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.1.4-RELEASE - ../../integration-mybatis-plugin-parent + 2.2.0-RELEASE + ../../integration-mybatis-plugin-parent/pom.xml integration-mybatis-plugin2 - 2.1.4-RELEASE + 2.2.0-RELEASE jar diff --git a/example/integration-mybatis/plugins/integration-mybatis-plugin2/src/main/java/com/mybatis/plugin2/ExamplePlugin2.java b/example/integration-mybatis/plugins/integration-mybatis-plugin2/src/main/java/com/mybatis/plugin2/ExamplePlugin2.java index b1faef581d6f427937fd0938a4ec745dce3ad9c5..da637499bfe9504e8c00136c683f766f7c477a40 100644 --- a/example/integration-mybatis/plugins/integration-mybatis-plugin2/src/main/java/com/mybatis/plugin2/ExamplePlugin2.java +++ b/example/integration-mybatis/plugins/integration-mybatis-plugin2/src/main/java/com/mybatis/plugin2/ExamplePlugin2.java @@ -2,7 +2,6 @@ package com.mybatis.plugin2; import com.gitee.starblues.extension.mybatis.configuration.SpringBootMybatisConfig; import com.gitee.starblues.realize.BasePlugin; -import org.pf4j.PluginException; import org.pf4j.PluginWrapper; import java.util.HashSet; @@ -25,12 +24,12 @@ public class ExamplePlugin2 extends BasePlugin implements SpringBootMybatisConfi } @Override - protected void startEvent() throws PluginException { + protected void startEvent() { } @Override - protected void deleteEvent() throws PluginException { + protected void deleteEvent() { } diff --git a/example/integration-mybatis/pom.xml b/example/integration-mybatis/pom.xml index 606631d8c4c84eee52af66ef88b98f1394bdd216..3f80dab3fbbdfe824cf7f215527ad289f78f51e0 100644 --- a/example/integration-mybatis/pom.xml +++ b/example/integration-mybatis/pom.xml @@ -7,7 +7,7 @@ com.gitee.starblues integration-mybatis - 2.1.4-RELEASE + 2.2.0-RELEASE pom 集成mybatis案例 diff --git a/example/integration-mybatisplus/integration-mybatisplus-main/pom.xml b/example/integration-mybatisplus/integration-mybatisplus-main/pom.xml index ab420400b00088a2d7648e5d81c1625bfe959668..a9f100ece132af80a2d8ede493fab84f0e4af884 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.1.4-RELEASE + 2.2.0-RELEASE integration-mybatisplus-main jar 集成mybatis-plus 案例--主程序 @@ -27,8 +27,8 @@ 2.0.1 3.2.0 - 2.1.4-RELEASE - 2.1.4-RELEASE + 2.2.0-RELEASE + 2.2.0-RELEASE 2.7.0 1.6 diff --git a/example/integration-mybatisplus/integration-mybatisplus-main/src/main/java/com/mybatisplus/main/config/PluginBeanConfig.java b/example/integration-mybatisplus/integration-mybatisplus-main/src/main/java/com/mybatisplus/main/config/PluginBeanConfig.java index 735e5488036544dea38b8c152d57313ba743b9ab..93c14a095ed6e5ac016def922114d241e97cf247 100644 --- a/example/integration-mybatisplus/integration-mybatisplus-main/src/main/java/com/mybatisplus/main/config/PluginBeanConfig.java +++ b/example/integration-mybatisplus/integration-mybatisplus-main/src/main/java/com/mybatisplus/main/config/PluginBeanConfig.java @@ -1,11 +1,8 @@ package com.mybatisplus.main.config; import com.gitee.starblues.extension.mybatis.SpringBootMybatisExtension; -import com.gitee.starblues.integration.*; -import com.gitee.starblues.integration.initialize.AutoPluginInitializer; -import com.gitee.starblues.integration.initialize.PluginInitializer; -import org.pf4j.PluginException; -import org.pf4j.PluginManager; +import com.gitee.starblues.integration.application.PluginApplication; +import com.gitee.starblues.integration.application.AutoPluginApplication; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -20,39 +17,17 @@ import org.springframework.context.annotation.Configuration; @Configuration public class PluginBeanConfig { - /** - * 通过默认的集成工厂返回 PluginManager - * @param integrationConfiguration 集成的配置文件 - * @return - * @throws PluginException - */ - @Bean - public PluginManager pluginManager(IntegrationConfiguration integrationConfiguration) throws PluginException { - IntegrationFactory integrationFactory = new DefaultIntegrationFactory(); - return integrationFactory.getPluginManager(integrationConfiguration); - } /** - * 定义默认的插件应用。使用可以注入它操作插件。 - * @return + * 定义插件应用。使用可以注入它操作插件。 + * @return PluginApplication */ @Bean public PluginApplication pluginApplication(){ - DefaultPluginApplication defaultPluginApplication = new DefaultPluginApplication(); - defaultPluginApplication.addExtension(new SpringBootMybatisExtension()); - return defaultPluginApplication; - } - - /** - * 初始化插件。此处定义可以在系统启动时自动加载插件。 - * 如果想手动加载插件, 则可以使用 com.plugin.development.integration.initialize.ManualPluginInitializer 来初始化插件。 - * @param pluginApplication - * @return - */ - @Bean - public PluginInitializer pluginInitializer(PluginApplication pluginApplication){ - AutoPluginInitializer autoPluginInitializer = new AutoPluginInitializer(pluginApplication); - return autoPluginInitializer; + // 实例化自动初始化插件的PluginApplication + PluginApplication pluginApplication = new AutoPluginApplication(); + pluginApplication.addExtension(new SpringBootMybatisExtension()); + return pluginApplication; } } diff --git a/example/integration-mybatisplus/integration-mybatisplus-main/src/main/resources/application-dev.yml b/example/integration-mybatisplus/integration-mybatisplus-main/src/main/resources/application-dev.yml index fb86076c138bf8da94ea42cdba02fe67f89a054e..25c6248b196a6e609ae198f3b01c935357052f27 100644 --- a/example/integration-mybatisplus/integration-mybatisplus-main/src/main/resources/application-dev.yml +++ b/example/integration-mybatisplus/integration-mybatisplus-main/src/main/resources/application-dev.yml @@ -3,7 +3,7 @@ server: spring: datasource: - url: jdbc:mysql://127.0.0.1:3306/plugin_mybatis_plus?useUnicode=true&useSSL=false&characterEncoding=utf8 + url: jdbc:mysql://127.0.0.1:3306/plugin_mybatis_plus?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=UTC username: root password: 123456 driver-class-name: com.mysql.jdbc.Driver diff --git a/example/integration-mybatisplus/integration-mybatisplus-main/src/main/resources/application-prod.yml b/example/integration-mybatisplus/integration-mybatisplus-main/src/main/resources/application-prod.yml index fb9583f2adc9790f7f74058723d9e75462510e6c..421c48b6527dc39976fa73b299443bfd09499ec6 100644 --- a/example/integration-mybatisplus/integration-mybatisplus-main/src/main/resources/application-prod.yml +++ b/example/integration-mybatisplus/integration-mybatisplus-main/src/main/resources/application-prod.yml @@ -3,7 +3,7 @@ server: spring: datasource: - url: jdbc:mysql://127.0.0.1:3306/plugin_mybatis_plus?useUnicode=true&useSSL=false&characterEncoding=utf8 + url: jdbc:mysql://127.0.0.1:3306/plugin_mybatis_plus?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=UTC username: root password: 123456 driver-class-name: com.mysql.jdbc.Driver diff --git a/example/integration-mybatisplus/plugins/integration-mybatisplus-plugin/plugin.properties b/example/integration-mybatisplus/plugins/integration-mybatisplus-plugin/plugin.properties index 61c686280b883184ac6b9c8b224b40a3f2dca7f5..3c62bc0251f8f7ffbf411efc168a5b35b387a2d8 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.1.4-RELEASE +plugin.version=2.2.0-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 ff0e50c1c9d349e8868ca500d735be02fb47b336..1eeb886aaae6765b3854e009c0f348dd31b5fedf 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.1.4-RELEASE + 2.2.0-RELEASE jar diff --git a/example/integration-mybatisplus/plugins/integration-mybatisplus-plugin/src/main/java/com/mybatisplus/plugin/MybatisPlusPlugin.java b/example/integration-mybatisplus/plugins/integration-mybatisplus-plugin/src/main/java/com/mybatisplus/plugin/MybatisPlusPlugin.java index 4909709e1b30d7ddb5ca05ff3e792fda0caa5a11..dc8bb4084001801cb65d73a8ce7e776a672dcfd6 100644 --- a/example/integration-mybatisplus/plugins/integration-mybatisplus-plugin/src/main/java/com/mybatisplus/plugin/MybatisPlusPlugin.java +++ b/example/integration-mybatisplus/plugins/integration-mybatisplus-plugin/src/main/java/com/mybatisplus/plugin/MybatisPlusPlugin.java @@ -2,7 +2,6 @@ package com.mybatisplus.plugin; import com.gitee.starblues.extension.mybatis.configuration.SpringBootMybatisConfig; import com.gitee.starblues.realize.BasePlugin; -import org.pf4j.PluginException; import org.pf4j.PluginWrapper; import java.util.HashSet; @@ -25,12 +24,12 @@ public class MybatisPlusPlugin extends BasePlugin implements SpringBootMybatisCo } @Override - protected void startEvent() throws PluginException { + protected void startEvent() { } @Override - protected void deleteEvent() throws PluginException { + protected void deleteEvent() { } diff --git a/example/integration-mybatisplus/pom.xml b/example/integration-mybatisplus/pom.xml index 7f7bcc30b16a2cfde478e1d71ec9eed460c7abe1..cc45b57c0f1299daf245bdd9759563d7fd6255a5 100644 --- a/example/integration-mybatisplus/pom.xml +++ b/example/integration-mybatisplus/pom.xml @@ -6,7 +6,7 @@ com.gitee.starblues integration-mybatisplus - 2.1.4-RELEASE + 2.2.0-RELEASE pom 集成mybatis-plus案例 diff --git a/example/pom.xml b/example/pom.xml index 42b8d7ed03fd036d3d5065255a9035b64e793905..d2fdd980f7c3b39c76e57be370e10e6c05a404d7 100644 --- a/example/pom.xml +++ b/example/pom.xml @@ -6,7 +6,7 @@ com.gitee.starblues springboot-plugin-framework-example - 2.1.4-RELEASE + 2.2.0-RELEASE pom diff --git a/pom.xml b/pom.xml index 1770ff02d98acc99bfc5adeb0b702031f74147d8..a279886db80ffd8005913028280adc9f576f14cc 100644 --- a/pom.xml +++ b/pom.xml @@ -7,7 +7,7 @@ com.gitee.starblues springboot-plugin-framework-parent pom - 2.1.4-RELEASE + 2.2.0-RELEASE spring boot 插件开发集成包 diff --git a/springboot-plugin-framework-extension/pom.xml b/springboot-plugin-framework-extension/pom.xml index 07c05d40be6b934bbb16f9df525354b7af137db2..898bede3a15a29abe2a1ea4d3c8830d07cb626d3 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.1.4-RELEASE + 2.2.0-RELEASE spring boot 插件式开发集成包--扩展模块 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 0536374e5aa5444f1e92cfa027971e8c0121b5a0..064ddadecf36ff7268f1cf248d6a04a5b2753985 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.1.4-RELEASE + 2.2.0-RELEASE jar 插件扩展-spring boot mybatis 集成扩展 @@ -64,7 +64,7 @@ 3.1.0 1.6 - 2.1.4-RELEASE + 2.2.0-RELEASE 2.0.1 3.2.0 diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/PluginMybatisXmlLoader.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/PluginMybatisXmlLoader.java index 53978edef0c5aeea9e76b1a0b678c8fe30189aab..ba805ff2feebb16c7e83249e2290b9fbe3b30ea3 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/PluginMybatisXmlLoader.java +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/PluginMybatisXmlLoader.java @@ -2,6 +2,7 @@ package com.gitee.starblues.extension.mybatis; import com.gitee.starblues.extension.mybatis.configuration.SpringBootMybatisConfig; import com.gitee.starblues.loader.PluginResourceLoader; +import com.gitee.starblues.loader.ResourceWrapper; import com.gitee.starblues.realize.BasePlugin; import com.gitee.starblues.utils.OrderExecution; import com.gitee.starblues.utils.OrderPriority; @@ -19,7 +20,7 @@ import java.util.*; * 定制插件 Mybatis xml 加载者 * * @author zhangzhuo - * @version 1.0 + * @version 2.2.0 */ public class PluginMybatisXmlLoader implements PluginResourceLoader { @@ -42,7 +43,7 @@ public class PluginMybatisXmlLoader implements PluginResourceLoader { } @Override - public List load(BasePlugin basePlugin) throws Exception { + public ResourceWrapper load(BasePlugin basePlugin) throws Exception { if(!(basePlugin instanceof SpringBootMybatisConfig)){ LOG.warn("Plugin <{}> not implements SpringBootMybatisConfig, If you need to use mybatis in the plugin," + "Please implements SpringBootMybatisConfig interface", basePlugin.getClass().getName()); @@ -53,7 +54,7 @@ public class PluginMybatisXmlLoader implements PluginResourceLoader { if(mybatisMapperXmlLocationsMatch == null || mybatisMapperXmlLocationsMatch.isEmpty()){ LOG.warn("SpringBootMybatisConfig -> mybatisMapperXmlLocationsMatch return is empty, " + "Please check configuration"); - return Collections.emptyList(); + return new ResourceWrapper(); } ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver(basePlugin.getWrapper().getPluginClassLoader()); @@ -67,7 +68,12 @@ public class PluginMybatisXmlLoader implements PluginResourceLoader { resources.addAll(loadResources); } } - return resources; + return new ResourceWrapper(resources); + } + + @Override + public void unload(BasePlugin basePlugin, ResourceWrapper resourceWrapper) throws Exception { + // } @Override diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/PluginMybatisXmlProcessor.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/PluginMybatisXmlProcessor.java index 0bd61100fca77bd8db9b120ca17842a9b50d8383..f6b237e45c995aaf5f49a72588a600425f0dad11 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/PluginMybatisXmlProcessor.java +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/PluginMybatisXmlProcessor.java @@ -1,6 +1,7 @@ package com.gitee.starblues.extension.mybatis; import com.gitee.starblues.extension.mybatis.utils.MybatisXmlProcess; +import com.gitee.starblues.loader.ResourceWrapper; import com.gitee.starblues.realize.BasePlugin; import com.gitee.starblues.factory.PluginRegistryInfo; import com.gitee.starblues.factory.process.pipe.PluginPipeProcessorExtend; @@ -16,7 +17,7 @@ import java.util.List; * mybatis xml 处理者 * * @author zhangzhuo - * @version 1.0 + * @version 2.2.0 */ public class PluginMybatisXmlProcessor implements PluginPipeProcessorExtend { @@ -48,15 +49,16 @@ public class PluginMybatisXmlProcessor implements PluginPipeProcessorExtend { } BasePlugin basePlugin = pluginRegistryInfo.getBasePlugin(); PluginWrapper pluginWrapper = pluginRegistryInfo.getPluginWrapper(); - List pluginResources = + ResourceWrapper resourceWrapper = basePlugin.getPluginResourceLoadFactory().getPluginResources(PluginMybatisXmlLoader.KEY); - if(pluginResources == null || pluginResources.isEmpty()){ + if(resourceWrapper == null){ return; } - boolean change = mybatisXmlProcess.isChange(pluginResources); - if(change){ - mybatisXmlProcess.loadXmlResource(pluginResources, pluginWrapper.getPluginClassLoader()); + List pluginResources = resourceWrapper.getResources(); + if(pluginResources == null || pluginResources.isEmpty()){ + return; } + mybatisXmlProcess.loadXmlResource(pluginResources, pluginWrapper.getPluginClassLoader()); } @Override diff --git a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/utils/MybatisXmlProcess.java b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/utils/MybatisXmlProcess.java index 7fc96fd0469f190f74d886f69318c78c782a8129..5ed326506bc1070264c4254712a2a1765b19b40e 100644 --- a/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/utils/MybatisXmlProcess.java +++ b/springboot-plugin-framework-extension/springboot-plugin-framework-extension-mybatis/src/main/java/com/gitee/starblues/extension/mybatis/utils/MybatisXmlProcess.java @@ -7,6 +7,7 @@ import org.apache.ibatis.session.SqlSessionFactory; import org.springframework.core.io.Resource; import java.io.IOException; +import java.io.InputStream; import java.lang.reflect.Field; import java.util.List; import java.util.Map; @@ -18,7 +19,7 @@ import java.util.concurrent.ConcurrentHashMap; * mybatis xml 操作者 * * @author zhangzhuo - * @version 1.0 + * @version 2.2.0 */ public class MybatisXmlProcess { @@ -62,17 +63,25 @@ public class MybatisXmlProcess { return; } Configuration configuration = factory.getConfiguration(); - //removeConfig(configuration); + // removeConfig(configuration); ClassLoader defaultClassLoader = Resources.getDefaultClassLoader(); try { Resources.setDefaultClassLoader(pluginClassLoader); for (Resource resource :resources) { - PluginMybatisXmlMapperBuilder xmlMapperBuilder = new PluginMybatisXmlMapperBuilder( - resource.getInputStream(), - configuration, resource.toString(), - configuration.getSqlFragments(), - pluginClassLoader); - xmlMapperBuilder.parse(); + InputStream inputStream = resource.getInputStream(); + try { + PluginMybatisXmlMapperBuilder xmlMapperBuilder = new PluginMybatisXmlMapperBuilder( + inputStream, + configuration, resource.toString(), + configuration.getSqlFragments(), + pluginClassLoader); + xmlMapperBuilder.parse(); + } finally { + if(inputStream != null){ + inputStream.close(); + } + } + } } finally { ErrorContext.instance().reset(); @@ -86,6 +95,7 @@ public class MybatisXmlProcess { * @return boolean * @throws IOException IOException */ + @Deprecated public boolean isChange(List resources) throws IOException { if(resources == null || resources.isEmpty()){ return false; diff --git a/springboot-plugin-framework/pom.xml b/springboot-plugin-framework/pom.xml index 1de711cdad556e9b5cd80e8cf536f61cb721427e..925111a28dd940d7e2e7b1a4dab5ad69ec050afe 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.1.4-RELEASE + 2.2.0-RELEASE spring boot 插件式开发集成包 @@ -64,8 +64,7 @@ 3.1.0 1.6 - 2.6.0 - 2.0.0 + 3.1.0 5.1.7.RELEASE 2.9.9 diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/PluginInfoContainer.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/PluginInfoContainer.java index 404cd5668194d2ae1f381dcb239e6dac7a891262..af1bb3ed52466c2005f4c99127907361a4f1e345 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/PluginInfoContainer.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/PluginInfoContainer.java @@ -55,6 +55,7 @@ public class PluginInfoContainer { * 是否存在bean名称 * @param pluginId 插件id * @param beanName 注册的bean名称 + * @return true 存在。false不存在 */ public static synchronized boolean existRegisterBeanName(String pluginId, String beanName){ Set beanNames = springRegisterBeanNames.get(pluginId); @@ -68,6 +69,7 @@ public class PluginInfoContainer { /** * 是否存在bean名称 * @param beanName 注册的bean名称 + * @return true 存在。false不存在 */ public static synchronized boolean existRegisterBeanName(String beanName){ for (Set beanNames : springRegisterBeanNames.values()){ 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 9e150d4d9a4b0091998837c581042f560688f68e..23ecdd1cea808045bd05dec4d91aa114655e4dcf 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 @@ -50,22 +50,38 @@ public class PluginRegistryInfo { return basePlugin; } + /** + * 添加类到类集合容器 + * @param aClass 类 + */ public void addClasses(Class aClass){ if(aClass != null){ classes.add(aClass); } } + /** + * 清除类集合容器 + */ public void cleanClasses(){ classes.clear(); } + /** + * 得到类集合容器 + * @return 类集合容器 + */ public List> getClasses(){ List> result = new ArrayList<>(); result.addAll(classes); return result; } + /** + * 添加分组的类型 + * @param key 分组key + * @param aClass 类 + */ public void addGroupClasses(String key, Class aClass){ List> classes = groupClasses.get(key); if(classes == null){ @@ -75,6 +91,11 @@ public class PluginRegistryInfo { classes.add(aClass); } + /** + * 通过分组key得到分组中的类类型 + * @param key 处理者key + * @return 类类型集合 + */ public List> getGroupClasses(String key){ List> classes = groupClasses.get(key); List> result = new ArrayList<>(); @@ -87,6 +108,7 @@ public class PluginRegistryInfo { /** * 得到插件bean注册者信息 * @param key 扩展的key + * @param 处理者类型 * @return 注册者信息 */ public T getProcessorInfo(String key){ @@ -134,5 +156,4 @@ public class PluginRegistryInfo { - } diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/configuration/AbstractConfigurationParser.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/configuration/AbstractConfigurationParser.java index 3634ebb2b08c42290733a52a9be601f4e8c81adf..c82c8fa973920278bdbc74be10355a5fb5c65a7a 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/configuration/AbstractConfigurationParser.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/factory/process/pipe/bean/configuration/AbstractConfigurationParser.java @@ -2,6 +2,7 @@ package com.gitee.starblues.factory.process.pipe.bean.configuration; import com.gitee.starblues.integration.IntegrationConfiguration; import com.gitee.starblues.loader.PluginResourceLoader; +import com.gitee.starblues.loader.ResourceWrapper; import com.gitee.starblues.loader.load.PluginConfigFileLoader; import com.gitee.starblues.realize.BasePlugin; import org.springframework.core.io.Resource; @@ -41,7 +42,11 @@ public abstract class AbstractConfigurationParser implements ConfigurationParser fileName, configuration.environment() ); - List resources = pluginResourceLoader.load(basePlugin); + ResourceWrapper resourceWrapper = pluginResourceLoader.load(basePlugin); + if(resourceWrapper == null){ + return null; + } + List resources = resourceWrapper.getResources(); if(resources.isEmpty() || resources.size() != 1){ return null; } 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 45c2215346063423e6bab5b166af47378519f90a..ae2774ca91289d1b37760c439980af2c379df13a 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 @@ -5,6 +5,7 @@ import com.gitee.starblues.factory.PluginRegistryInfo; import com.gitee.starblues.factory.process.pipe.PluginPipeProcessor; import com.gitee.starblues.factory.process.pipe.classs.group.*; import com.gitee.starblues.loader.PluginResourceLoadFactory; +import com.gitee.starblues.loader.ResourceWrapper; import com.gitee.starblues.loader.load.PluginClassLoader; import com.gitee.starblues.realize.BasePlugin; import org.slf4j.Logger; @@ -68,7 +69,11 @@ public class PluginClassProcess implements PluginPipeProcessor { public void registry(PluginRegistryInfo pluginRegistryInfo) throws Exception { BasePlugin basePlugin = pluginRegistryInfo.getBasePlugin(); PluginResourceLoadFactory pluginResourceLoadFactory = basePlugin.getPluginResourceLoadFactory(); - List pluginResources = pluginResourceLoadFactory.getPluginResources(PluginClassLoader.KEY); + ResourceWrapper resourceWrapper = pluginResourceLoadFactory.getPluginResources(PluginClassLoader.KEY); + if(resourceWrapper == null){ + return; + } + List pluginResources = resourceWrapper.getResources(); if(pluginResources == null){ return; } diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/ConfigurationBuilder.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/ConfigurationBuilder.java new file mode 100644 index 0000000000000000000000000000000000000000..ab23f576f4504a69f7b93e37129d8eabf99ef2ff --- /dev/null +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/ConfigurationBuilder.java @@ -0,0 +1,145 @@ +package com.gitee.starblues.integration; + +import org.pf4j.RuntimeMode; +import org.springframework.util.StringUtils; + +import java.util.Objects; + +/** + * 通过构造者进行配置插件初始化配置 + * + * @author zhangzhuo + * @version 2.2.0 + */ +public class ConfigurationBuilder extends DefaultIntegrationConfiguration{ + + private RuntimeMode runtimeMode = RuntimeMode.DEVELOPMENT; + private String pluginPath = ""; + private String pluginConfigFilePath = ""; + + private String uploadTempPath; + private String backupPath; + private String pluginRestControllerPathPrefix; + private Boolean enablePluginIdRestControllerPathPrefix; + + + public ConfigurationBuilder(Builder builder) { + this.runtimeMode = Objects.requireNonNull(builder.runtimeMode, "runtimeMode can't be empty"); + this.pluginPath = Objects.requireNonNull(builder.pluginPath, "pluginPath can't be empty"); + this.pluginConfigFilePath = Objects.requireNonNull(builder.pluginConfigFilePath, + "pluginConfigFilePath can't be empty"); + this.uploadTempPath = builder.uploadTempPath; + this.backupPath = builder.backupPath; + this.pluginRestControllerPathPrefix = builder.pluginRestControllerPathPrefix; + this.enablePluginIdRestControllerPathPrefix = builder.enablePluginIdRestControllerPathPrefix; + } + + public static Builder toBuilder(){ + return new Builder(); + } + + public static class Builder{ + private RuntimeMode runtimeMode = RuntimeMode.DEVELOPMENT; + private String pluginPath = ""; + private String pluginConfigFilePath = ""; + + private String uploadTempPath; + private String backupPath; + private String pluginRestControllerPathPrefix; + private Boolean enablePluginIdRestControllerPathPrefix; + + public Builder runtimeMode(RuntimeMode runtimeMode){ + this.runtimeMode = runtimeMode; + return this; + } + + public Builder pluginPath(String pluginPath){ + this.pluginPath = pluginPath; + return this; + } + + public Builder pluginConfigFilePath(String pluginConfigFilePath){ + this.pluginConfigFilePath = pluginConfigFilePath; + return this; + } + + public Builder uploadTempPath(String uploadTempPath){ + this.uploadTempPath = uploadTempPath; + return this; + } + + public Builder backupPath(String backupPath){ + this.backupPath = backupPath; + return this; + } + + public Builder pluginRestControllerPathPrefix(String pluginRestControllerPathPrefix){ + this.pluginRestControllerPathPrefix = pluginRestControllerPathPrefix; + return this; + } + + public Builder enablePluginIdRestControllerPathPrefix(Boolean enablePluginIdRestControllerPathPrefix){ + this.enablePluginIdRestControllerPathPrefix = enablePluginIdRestControllerPathPrefix; + return this; + } + + public ConfigurationBuilder build(){ + return new ConfigurationBuilder(this); + } + + } + + + + @Override + public RuntimeMode environment() { + return runtimeMode; + } + + @Override + public String pluginPath() { + return pluginPath; + } + + @Override + public String pluginConfigFilePath() { + return pluginConfigFilePath; + } + + + @Override + public String uploadTempPath() { + if(StringUtils.isEmpty(uploadTempPath)){ + return super.uploadTempPath(); + } else { + return uploadTempPath; + } + } + + @Override + public String backupPath() { + if(StringUtils.isEmpty(backupPath)){ + return super.backupPath(); + } else { + return backupPath; + } + } + + @Override + public String pluginRestControllerPathPrefix() { + if(StringUtils.isEmpty(pluginRestControllerPathPrefix)){ + return super.pluginRestControllerPathPrefix(); + } else { + return pluginRestControllerPathPrefix; + } + } + + @Override + public boolean enablePluginIdRestControllerPathPrefix() { + if(enablePluginIdRestControllerPathPrefix == null){ + return super.enablePluginIdRestControllerPathPrefix(); + } else { + return enablePluginIdRestControllerPathPrefix; + } + } +} diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/DefaultPluginApplication.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/DefaultPluginApplication.java deleted file mode 100644 index ea307bc86bc9bf0668be3ec4e5a8517febd4e7d7..0000000000000000000000000000000000000000 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/DefaultPluginApplication.java +++ /dev/null @@ -1,134 +0,0 @@ -package com.gitee.starblues.integration; - -import com.gitee.starblues.extension.AbstractExtension; -import com.gitee.starblues.extension.ExtensionFactory; -import com.gitee.starblues.integration.listener.PluginListener; -import com.gitee.starblues.integration.listener.PluginListenerFactory; -import com.gitee.starblues.integration.operator.DefaultPluginOperator; -import com.gitee.starblues.integration.operator.PluginOperator; -import com.gitee.starblues.integration.user.DefaultPluginUser; -import com.gitee.starblues.integration.user.PluginUser; -import org.pf4j.PluginManager; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.BeansException; -import org.springframework.beans.factory.BeanCreationException; -import org.springframework.context.ApplicationContext; -import org.springframework.context.ApplicationContextAware; -import org.springframework.context.support.GenericApplicationContext; - -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; - -/** - * 开发者直接使用的。插件应用 - * @author zhangzhuo - * @version 2.0.2 - */ -public class DefaultPluginApplication implements ApplicationContextAware, PluginApplication { - - private final Logger log = LoggerFactory.getLogger(DefaultPluginApplication.class); - - private ApplicationContext applicationContext; - private PluginManager pluginManager; - private ExtensionFactory extensionFactory = ExtensionFactory.getSingleton(); - - private PluginOperator pluginOperator; - private PluginUser pluginUser; - - private PluginListenerFactory listenerFactory = new PluginListenerFactory(); - - public DefaultPluginApplication() { - this(null); - } - - - public DefaultPluginApplication(List pluginListeners) { - addListener(pluginListeners); - } - - - @Override - public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { - Objects.requireNonNull(applicationContext); - this.applicationContext = applicationContext; - this.pluginManager = applicationContext.getBean(PluginManager.class); - try { - IntegrationConfiguration configuration = applicationContext.getBean(IntegrationConfiguration.class); - this.pluginUser = new DefaultPluginUser(this.applicationContext, this.pluginManager); - this.pluginOperator = new DefaultPluginOperator( - applicationContext, - configuration, - this.pluginManager, - this.listenerFactory - ); - } catch (Exception e) { - throw new BeanCreationException("Instant PluginUser or PluginOperator Failure : " + e.getMessage(), e); - } - } - - - @Override - public PluginOperator getPluginOperator() { - assertInjected(); - return this.pluginOperator; - } - - @Override - public PluginUser getPluginUser() { - assertInjected(); - return this.pluginUser; - } - - /** - * 检查注入 - */ - private void assertInjected() { - if (this.applicationContext == null) { - throw new RuntimeException("ApplicationContext is null, Please check whether the DefaultPluginApplication is injected"); - } - if (this.pluginManager == null) { - throw new RuntimeException("PluginManager is null, Please check whether the PluginManager is injected"); - } - if (this.pluginOperator == null) { - throw new RuntimeException("PluginOperator is null," + - " Please check whether the PluginManager or ApplicationContext is injected"); - } - if (this.pluginUser == null) { - throw new RuntimeException("pluginUser is null," + - " Please check whether the PluginManager or ApplicationContext is injected"); - } - } - - /** - * 添加插件扩展 - * @param extension 扩展实现对象 - * @return DefaultPluginApplication - */ - public DefaultPluginApplication addExtension(AbstractExtension extension) { - this.extensionFactory.addExtension(extension); - return this; - } - - - @Override - public void addListener(PluginListener pluginListener) { - this.listenerFactory.addPluginListener(pluginListener); - } - - @Override - public void addListener(Class pluginListenerClass) { - listenerFactory.addPluginListener(pluginListenerClass); - } - - @Override - public void addListener(List pluginListeners) { - if(pluginListeners == null || pluginListeners.isEmpty()){ - return; - } - for (PluginListener pluginListener : pluginListeners) { - this.listenerFactory.addPluginListener(pluginListener); - } - } -} diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/PluginListenerContext.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/PluginListenerContext.java index a0af24721ac5cb219c1532918cb0527bd761738c..e25e698b8dc1198e9590d849e292ecdab2c24d5f 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/PluginListenerContext.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/PluginListenerContext.java @@ -9,7 +9,7 @@ import java.util.List; * 插件bean监听者上下文。 * 注意: 监听者必须在初始化插件前添加,否则在初始化阶段可能无法触发添加的监听者。 * @author zhangzhuo - * @version 1.0 + * @version 2.2.0 */ public interface PluginListenerContext { @@ -19,9 +19,11 @@ public interface PluginListenerContext { */ void addListener(PluginListener pluginListener); + /** * 添加监听者 * @param pluginListenerClass 插件监听者Class类 + * @param 继承PluginListener的子类 */ void addListener(Class pluginListenerClass); 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 new file mode 100644 index 0000000000000000000000000000000000000000..ab1fb9c68336b1849fde685cec896449364db1ef --- /dev/null +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/application/AbstractPluginApplication.java @@ -0,0 +1,69 @@ +package com.gitee.starblues.integration.application; + +import com.gitee.starblues.extension.AbstractExtension; +import com.gitee.starblues.extension.ExtensionFactory; +import com.gitee.starblues.integration.IntegrationConfiguration; +import com.gitee.starblues.integration.listener.PluginListener; +import com.gitee.starblues.integration.listener.PluginListenerFactory; +import org.springframework.beans.factory.BeanCreationException; +import org.springframework.context.ApplicationContext; + +import java.util.List; + +/** + * 公用的的插件应用 + * + * @author zhangzhuo + * @version 2.2.0 + */ +public abstract class AbstractPluginApplication implements PluginApplication { + + protected final PluginListenerFactory listenerFactory = new PluginListenerFactory(); + protected final ExtensionFactory extensionFactory = ExtensionFactory.getSingleton(); + + + @Override + public void addExtension(AbstractExtension extension) { + extensionFactory.addExtension(extension); + } + + @Override + public void addListener(PluginListener pluginListener) { + this.listenerFactory.addPluginListener(pluginListener); + } + + @Override + public void addListener(Class pluginListenerClass) { + listenerFactory.addPluginListener(pluginListenerClass); + } + + @Override + public void addListener(List pluginListeners) { + if(pluginListeners == null || pluginListeners.isEmpty()){ + return; + } + for (PluginListener pluginListener : pluginListeners) { + this.listenerFactory.addPluginListener(pluginListener); + } + } + + /** + * 子类可通过Application 获取插件定义的配置 + * @param applicationContext applicationContext + * @return IntegrationConfiguration + */ + protected IntegrationConfiguration getConfiguration(ApplicationContext applicationContext){ + IntegrationConfiguration configuration = null; + try { + configuration = applicationContext.getBean(IntegrationConfiguration.class); + } catch (Exception e){ + // no show exception + } + if(configuration == null){ + throw new BeanCreationException("Not Found IntegrationConfiguration, Please define " + + "IntegrationConfiguration to Spring Bean."); + } + return configuration; + } + +} diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/application/AutoPluginApplication.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/application/AutoPluginApplication.java new file mode 100644 index 0000000000000000000000000000000000000000..dcba0712e210ef5350ac86d34e3b26474e6e334a --- /dev/null +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/application/AutoPluginApplication.java @@ -0,0 +1,62 @@ +package com.gitee.starblues.integration.application; + +import com.gitee.starblues.integration.pf4j.Pf4jFactory; +import com.gitee.starblues.integration.listener.PluginInitializerListener; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; + +/** + * 自动初始化的 PluginApplication。该PluginApplication 基于 Spring InitializingBean 自动初始化插件。 + * + * @author zhangzhuo + * @version 2.2.0 + */ +public class AutoPluginApplication extends DefaultPluginApplication + implements PluginApplication, InitializingBean, ApplicationContextAware { + + private ApplicationContext applicationContext; + private PluginInitializerListener pluginInitializerListener; + + public AutoPluginApplication() { + super(); + } + + public AutoPluginApplication(Pf4jFactory integrationFactory) { + super(integrationFactory); + } + + /** + * 设置插件初始化监听器 + * @param pluginInitializerListener 插件监听器 + */ + public void setPluginInitializerListener(PluginInitializerListener pluginInitializerListener) { + this.pluginInitializerListener = pluginInitializerListener; + } + + + @Override + public void initialize(ApplicationContext applicationContext, + PluginInitializerListener listener) { + // 此处不允许手动初始化! + throw new RuntimeException("Cannot be initialized manually"); + } + + + @Override + public void setApplicationContext(ApplicationContext applicationContext) { + this.applicationContext = applicationContext; + } + + /** + * Spring boot bean属性被Set完后调用。会自动初始化插件 + * @throws Exception 初始化异常 + */ + @Override + public void afterPropertiesSet() throws Exception { + if(applicationContext == null){ + throw new Exception("Auto initialize failed. ApplicationContext Not injected."); + } + super.initialize(applicationContext, pluginInitializerListener); + } +} diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/application/DefaultPluginApplication.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/application/DefaultPluginApplication.java new file mode 100644 index 0000000000000000000000000000000000000000..882c753c522b7059b5eb65ff2b781c173a9f1c4a --- /dev/null +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/application/DefaultPluginApplication.java @@ -0,0 +1,96 @@ +package com.gitee.starblues.integration.application; + +import com.gitee.starblues.integration.pf4j.DefaultPf4JFactory; +import com.gitee.starblues.integration.IntegrationConfiguration; +import com.gitee.starblues.integration.pf4j.Pf4jFactory; +import com.gitee.starblues.integration.listener.PluginInitializerListener; +import com.gitee.starblues.integration.operator.DefaultPluginOperator; +import com.gitee.starblues.integration.operator.PluginOperator; +import com.gitee.starblues.integration.user.DefaultPluginUser; +import com.gitee.starblues.integration.user.PluginUser; +import org.pf4j.PluginManager; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.context.ApplicationContext; + +import java.util.Objects; +import java.util.concurrent.atomic.AtomicBoolean; + + +/** + * 默认的插件 PluginApplication + * @author zhangzhuo + * @version 2.2.0 + */ +public class DefaultPluginApplication extends AbstractPluginApplication { + + private final Logger log = LoggerFactory.getLogger(DefaultPluginApplication.class); + + private Pf4jFactory integrationFactory; + private PluginUser pluginUser; + private PluginOperator pluginOperator; + + private AtomicBoolean beInitialized = new AtomicBoolean(false); + + public DefaultPluginApplication() { + } + + public DefaultPluginApplication(Pf4jFactory integrationFactory){ + this.integrationFactory = integrationFactory; + } + + + @Override + public synchronized void initialize(ApplicationContext applicationContext, + PluginInitializerListener listener) { + Objects.requireNonNull(applicationContext, "ApplicationContext can't be null"); + if(beInitialized.get()){ + throw new RuntimeException("Plugin has been initialized"); + } + IntegrationConfiguration configuration = getConfiguration(applicationContext); + if(integrationFactory == null){ + integrationFactory = new DefaultPf4JFactory(configuration); + } + PluginManager pluginManager = integrationFactory.getPluginManager(); + pluginUser = new DefaultPluginUser(applicationContext, pluginManager); + pluginOperator = new DefaultPluginOperator( + applicationContext, + configuration, + pluginManager, + this.listenerFactory + ); + try { + pluginOperator.initPlugins(listener); + beInitialized.set(true); + } catch (Exception e) { + e.printStackTrace(); + } + } + + + @Override + public PluginOperator getPluginOperator() { + assertInjected(); + return pluginOperator; + } + + @Override + public PluginUser getPluginUser() { + assertInjected(); + return pluginUser; + } + + /** + * 检查注入 + */ + private void assertInjected() { + if (this.pluginUser == null) { + throw new RuntimeException("PluginUser is null, Please check whether the DefaultPluginApplication is injected"); + } + if (this.pluginOperator == null) { + throw new RuntimeException("PluginOperator is null, Please check whether the DefaultPluginApplication is injected"); + } + } + + +} diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/PluginApplication.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/application/PluginApplication.java similarity index 39% rename from springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/PluginApplication.java rename to springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/application/PluginApplication.java index d071f677c2e689ca9793c7065f6b9df2ff5efd62..233475f1f17191d159466e364a0d1d05648514c1 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/PluginApplication.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/application/PluginApplication.java @@ -1,15 +1,26 @@ -package com.gitee.starblues.integration; +package com.gitee.starblues.integration.application; +import com.gitee.starblues.extension.AbstractExtension; +import com.gitee.starblues.integration.PluginListenerContext; +import com.gitee.starblues.integration.listener.PluginInitializerListener; import com.gitee.starblues.integration.operator.PluginOperator; import com.gitee.starblues.integration.user.PluginUser; +import org.springframework.context.ApplicationContext; /** - * 插件应用。需要主程序定义成@Bean + * 插件应用。 * @author zhangzhuo - * @version 2.0.2 + * @version 2.2.0 */ public interface PluginApplication extends PluginListenerContext { + /** + * 初始化 + * @param applicationContext Spring上下文 + * @param listener 插件初始化监听者 + */ + void initialize(ApplicationContext applicationContext, PluginInitializerListener listener); + /** * 获得插插件操作者 @@ -23,4 +34,10 @@ public interface PluginApplication extends PluginListenerContext { */ PluginUser getPluginUser(); + /** + * 添加扩展 + * @param extension 扩展类 + */ + void addExtension(AbstractExtension extension); + } diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/application/package-info.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/application/package-info.java new file mode 100644 index 0000000000000000000000000000000000000000..96722a4bbd8d0dd73e7f137e246ba75cdfa8e99e --- /dev/null +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/application/package-info.java @@ -0,0 +1,7 @@ +/** + * 插件 PluginApplication 的实现包 + * + * @author zhangzhuo + * @version 1.0 + */ +package com.gitee.starblues.integration.application; \ No newline at end of file diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/initialize/AbstractPluginInitializer.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/initialize/AbstractPluginInitializer.java deleted file mode 100644 index a9e87260e65010170166363866c44776cd8080ee..0000000000000000000000000000000000000000 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/initialize/AbstractPluginInitializer.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.gitee.starblues.integration.initialize; - -import com.gitee.starblues.integration.listener.PluginInitializerListener; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * 抽象的插件初始化者 - * @author zhangzhuo - * @version 1.0 - * @see AutoPluginInitializer - * @see ManualPluginInitializer - */ -public abstract class AbstractPluginInitializer implements PluginInitializer{ - - private final Logger log = LoggerFactory.getLogger(this.getClass()); - - protected PluginInitializerListener pluginInitializerListener; - - protected AbstractPluginInitializer() { - } - - protected AbstractPluginInitializer(PluginInitializerListener pluginInitializerListener) { - this.pluginInitializerListener = pluginInitializerListener; - } - - @Override - public void initialize() throws Exception { - log.info("Start execute plugin initializer."); - this.executeInitialize(); - } - - /** - * 执行初始化 - * @throws Exception 插件执行初始化异常 - */ - public abstract void executeInitialize() throws Exception; - - - /** - * 设置监听者 - * @param pluginInitializerListener 初始化监听者 - */ - public void setPluginInitializerListener(PluginInitializerListener pluginInitializerListener) { - this.pluginInitializerListener = pluginInitializerListener; - } - -} diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/initialize/AutoPluginInitializer.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/initialize/AutoPluginInitializer.java deleted file mode 100644 index 28ef0c8eef5e67ce4d780821d9817a6348d310a0..0000000000000000000000000000000000000000 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/initialize/AutoPluginInitializer.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.gitee.starblues.integration.initialize; - -import com.gitee.starblues.integration.PluginApplication; -import com.gitee.starblues.integration.listener.PluginInitializerListener; -import com.gitee.starblues.integration.operator.PluginOperator; -import org.springframework.beans.factory.annotation.Autowired; - -import javax.annotation.PostConstruct; - -/** - * 自动初始化者 - * @author zhangzhuo - * @version 1.0 - */ -public class AutoPluginInitializer extends AbstractPluginInitializer { - - - private final PluginOperator pluginOperator; - - - public AutoPluginInitializer(@Autowired PluginApplication pluginApplication) { - this.pluginOperator = pluginApplication.getPluginOperator(); - } - - public AutoPluginInitializer(PluginApplication pluginApplication, - PluginInitializerListener pluginInitializerListener) { - super(pluginInitializerListener); - this.pluginOperator = pluginApplication.getPluginOperator(); - } - - - @PostConstruct - @Override - public void executeInitialize() throws Exception { - pluginOperator.initPlugins(pluginInitializerListener); - } - -} diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/initialize/ManualPluginInitializer.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/initialize/ManualPluginInitializer.java deleted file mode 100644 index ae1d9dc95d87efcac9515606b376aa5a064b4045..0000000000000000000000000000000000000000 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/initialize/ManualPluginInitializer.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.gitee.starblues.integration.initialize; - -import com.gitee.starblues.integration.PluginApplication; -import com.gitee.starblues.integration.listener.PluginInitializerListener; -import com.gitee.starblues.integration.operator.PluginOperator; - -/** - * 插件手动初始化者 - * @author zhangzhuo - * @version 1.0 - */ -public class ManualPluginInitializer extends AbstractPluginInitializer { - - private final PluginOperator pluginOperator; - - public ManualPluginInitializer(PluginApplication pluginApplication) { - this.pluginOperator = pluginApplication.getPluginOperator(); - } - - public ManualPluginInitializer(PluginApplication pluginApplication, - PluginInitializerListener pluginInitializerListener) { - super(pluginInitializerListener); - this.pluginOperator = pluginApplication.getPluginOperator(); - } - - - @Override - public void executeInitialize() throws Exception { - pluginOperator.initPlugins(pluginInitializerListener); - } - -} diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/initialize/PluginInitializer.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/initialize/PluginInitializer.java deleted file mode 100644 index 4c4b09453a7d1719604b92c3993edd0bbcdb98ff..0000000000000000000000000000000000000000 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/initialize/PluginInitializer.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.gitee.starblues.integration.initialize; - - -/** - * 插件初始化者 - * @author zhangzhuo - * @version 1.0 - * @see AbstractPluginInitializer - */ -public interface PluginInitializer { - - /** - * 初始化 - * @throws Exception 插件安装异常 - */ - void initialize() throws Exception; - - -} diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/listener/PluginListenerFactory.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/listener/PluginListenerFactory.java index 83cd74471e38db52fe3686e98c1f4d2f741acb0d..629eac24c45f496dec6794f80ecae3422e390624 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/listener/PluginListenerFactory.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/listener/PluginListenerFactory.java @@ -1,6 +1,5 @@ package com.gitee.starblues.integration.listener; -import org.springframework.context.ApplicationContext; import org.springframework.context.support.GenericApplicationContext; import java.util.ArrayList; @@ -63,6 +62,7 @@ public class PluginListenerFactory implements PluginListener{ /** * 添加监听者 * @param pluginListenerClass 插件监听者Class类 + * @param 插件监听者类。继承 PluginListener */ public void addPluginListener(Class pluginListenerClass){ if(pluginListenerClass != null){ @@ -93,4 +93,12 @@ public class PluginListenerFactory implements PluginListener{ public List getListeners() { return listeners; } + + /** + * 得到监听者class + * @return 监听者class集合 + */ + public List getListenerClasses() { + return listenerClasses; + } } diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/operator/DefaultPluginOperator.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/operator/DefaultPluginOperator.java index 872c1c485d79b5f36fc71a333a4b5ba959a7cb98..6070a4bbb987810b5f88bc5ace04757097360066 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/operator/DefaultPluginOperator.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/operator/DefaultPluginOperator.java @@ -34,7 +34,7 @@ import java.util.stream.Collectors; /** * 默认的插件操作者 * @author zhangzhuo - * @version 2.1.0 + * @version 2.2.0 */ public class DefaultPluginOperator implements PluginOperator { @@ -57,8 +57,8 @@ public class DefaultPluginOperator implements PluginOperator { IntegrationConfiguration integrationConfiguration, PluginManager pluginManager, PluginListenerFactory pluginListenerFactory) { - Objects.requireNonNull(integrationConfiguration); - Objects.requireNonNull(pluginManager); + Objects.requireNonNull(integrationConfiguration, "IntegrationConfiguration can't be null"); + Objects.requireNonNull(pluginManager, "PluginManager can't be null"); this.integrationConfiguration = integrationConfiguration; this.pluginManager = pluginManager; this.pluginFactory = new DefaultPluginFactory(applicationContext, pluginListenerFactory); @@ -111,14 +111,32 @@ public class DefaultPluginOperator implements PluginOperator { } String pluginId = null; try { - pluginId = pluginManager.loadPlugin(path); + if(!Files.exists(path)){ + throw new FileNotFoundException("Not found this path " + path); + } + Path pluginsRoot = pluginManager.getPluginsRoot(); + if(path.getParent().compareTo(pluginsRoot) == 0){ + // 说明该插件文件存在于插件root目录下。 + pluginId = pluginManager.loadPlugin(path); + } else { + File sourceFile = path.toFile(); + String targetPathString = pluginsRoot.toString() + File.separator + + sourceFile.getName(); + Path targetPath = PluginFileUtils.getExistPath(Paths.get(targetPathString)); + if(Files.exists(targetPath)){ + // 如果存在该文件, 则备份 + backup(targetPath, "install-backup", 2); + } + FileUtils.copyFile(sourceFile, targetPath.toFile()); + pluginId = pluginManager.loadPlugin(targetPath); + } if(StringUtils.isEmpty(pluginId)){ log.error("Install plugin '{}' failure, this plugin id is empty.", pluginId); return false; } GlobalRegistryInfo.addOperatorPluginInfo(pluginId, PluginOperatorInfo.OperatorType.INSTALL, true); if(start(pluginId)){ - log.info("Install plugin '{}' success. {}", pluginId); + log.info("Install plugin '{}' success", pluginId); return true; } else { log.error("Install plugin '{}' failure", pluginId); @@ -129,7 +147,7 @@ public class DefaultPluginOperator implements PluginOperator { log.error("Install plugin '{}' failure. {}", pluginId, e.getMessage()); log.info("Start uninstall plugin '{}' failure", pluginId); try { - uninstall(pluginId); + uninstall(pluginId, false); } catch (Exception uninstallException){ log.error("Uninstall plugin '{}' failure. {}", pluginId, e.getMessage()); } @@ -142,11 +160,10 @@ public class DefaultPluginOperator implements PluginOperator { } @Override - public boolean uninstall(String pluginId) throws Exception { + public boolean uninstall(String pluginId, boolean isBackup) throws Exception { PluginWrapper pluginWrapper = pluginManager.getPlugin(pluginId); if(pluginWrapper == null){ - log.error("Uninstall plugin failure, Not found plugin '{}'", pluginId); - return false; + throw new Exception("Uninstall plugin failure, Not found plugin ''" + pluginId + "'"); } Exception exception = null; try { @@ -157,9 +174,11 @@ public class DefaultPluginOperator implements PluginOperator { exception = e; } try { - if (pluginManager.unloadPlugin(pluginId)) { - // 卸载完后,将插件文件移到备份文件中 - backup(pluginWrapper.getPluginPath(), "uninstallPlugin", 1); + if(isBackup){ + // 将插件文件移到备份文件中 + backup(pluginWrapper.getPluginPath(), "uninstall", 1); + } + if (pluginManager.deletePlugin(pluginId)) { log.info("Uninstall plugin '{}' success", pluginId); return true; } else { @@ -262,6 +281,9 @@ public class DefaultPluginOperator implements PluginOperator { String configPath = integrationConfiguration.pluginConfigFilePath() + File.separator + sourceFile.getName(); Path targetPath = PluginFileUtils.getExistPath(Paths.get(configPath)); + if(Files.exists(targetPath)){ + backup(targetPath, "install-config-backup",2); + } FileUtils.copyFile(sourceFile, targetPath.toFile()); return true; } @@ -274,22 +296,25 @@ public class DefaultPluginOperator implements PluginOperator { String fileName = configFile.getOriginalFilename(); String configPath = integrationConfiguration.pluginConfigFilePath() + File.separator + fileName; - Path srcPath = PluginFileUtils.getExistPath(Paths.get(configPath)); - Files.write(srcPath, configFile.getBytes()); + Path targetPath = PluginFileUtils.getExistPath(Paths.get(configPath)); + if(Files.exists(targetPath)){ + backup(targetPath, "upload-config-backup",2); + } + Files.write(targetPath, configFile.getBytes()); return true; } @Override - public boolean backupPlugin(Path path, String appendName) throws Exception { + public boolean backupPlugin(Path path, String sign) throws Exception { Objects.requireNonNull(path); - return backup(path, appendName, 2); + return backup(path, sign, 2); } @Override - public boolean backupPlugin(String pluginId, String appendName) throws Exception { + public boolean backupPlugin(String pluginId, String sign) throws Exception { PluginWrapper pluginManager = getPluginWrapper(pluginId, "BackupPlugin by pluginId"); - return backupPlugin(pluginManager.getPluginPath(), appendName); + return backupPlugin(pluginManager.getPluginPath(), sign); } @Override @@ -362,7 +387,7 @@ public class DefaultPluginOperator implements PluginOperator { File target = pluginFilePath.toFile(); if(target.exists()){ // 存在则拷贝一份 - backup(pluginFilePath, "uploadPlugin", 2); + backup(pluginFilePath, "upload", 2); } FileUtils.copyFile(verifyPath.toFile(), target); // 删除临时文件 @@ -415,25 +440,29 @@ public class DefaultPluginOperator implements PluginOperator { /** * 备份 * @param sourcePath 源文件的路径 - * @param appendName 追加的字符串 + * @param sign 文件标志 * @param type 类型 1移动 2拷贝 * @return 结果 - * @throws Exception Exception */ - private boolean backup(Path sourcePath, String appendName, int type) throws Exception { - if(isDev()){ - // 如果是开发环境, 则不进行备份 - return true; - } - if(!Files.exists(sourcePath)){ - throw new FileNotFoundException("path ' " + sourcePath.toString() + "' does not exist!"); - } + private boolean backup(Path sourcePath, String sign, int type) { try { + if(isDev()){ + // 如果是开发环境, 则不进行备份 + return false; + } + if(sourcePath == null){ + return false; + } + if(!Files.exists(sourcePath)){ + log.error("path '{}' does not exist", sourcePath.toString()); + return false; + } String fileName = sourcePath.getFileName().toString(); - String targetName = integrationConfiguration.backupPath() + File.separator + getNowTimeByFormat(); - if(!StringUtils.isEmpty(appendName)){ - targetName = targetName + "_" + appendName; + String targetName = integrationConfiguration.backupPath() + File.separator; + if(!StringUtils.isEmpty(sign)){ + targetName = targetName + "[" + sign + "]"; } + targetName = targetName + "[" + getNowTimeByFormat() + "]"; Path target = Paths.get(targetName + "_" + fileName); if(!Files.exists(target.getParent())){ Files.createDirectories(target.getParent()); @@ -444,13 +473,15 @@ public class DefaultPluginOperator implements PluginOperator { // 源文件字节为0, 说明为删除的插件。不需要备份 return true; } - FileUtils.writeByteArrayToFile(targetFile, FileUtils.readFileToByteArray(sourceFile)); + FileUtils.copyFile(sourceFile, targetFile); if(type == 1){ - FileUtils.writeByteArrayToFile(sourceFile, "".getBytes()); + // 是移动的话, 则删除源文件 + FileUtils.deleteQuietly(sourceFile); } return true; } catch (IOException e) { - throw new Exception("Backup plugin jar '" + sourcePath.toString() + "' failure : " + e.getMessage(), e); + log.error("Backup plugin jar '{}' failure. {}", sourcePath.toString(), e.getMessage(), e); + return false; } } diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/operator/PluginOperator.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/operator/PluginOperator.java index 091b5fafbee7e23459f2ad8b6efd7beac32f72fd..6e521502522c96f8b2c0f5c8e4de8a63685ad9c2 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/operator/PluginOperator.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/operator/PluginOperator.java @@ -12,7 +12,7 @@ import java.util.Set; /** * 操作插件的接口 * @author zhangzhuo - * @version 1.0 + * @version 2.2.0 * @see DefaultPluginOperator */ public interface PluginOperator { @@ -28,6 +28,7 @@ public interface PluginOperator { /** * 通过路径安装插件(会启用), 该插件文件必须存在于服务器 [适用于生产环境] + * 如果在插件目录存在同名的插件包, 系统会自动备份该插件包。备份文件命名规则为;[install-backup][时间]_原jar名.jar * @param path 插件路径 * @return 成功返回true.不成功抛出异常或者返回false * @throws Exception 异常信息 @@ -38,10 +39,11 @@ public interface PluginOperator { /** * 卸载插件 [适用于生产环境] * @param pluginId 插件id + * @param isBackup 是否备份原来的插件。备份文件命名规则为;[uninstall][时间]_原jar名.jar * @return 成功返回true.不成功抛出异常或者返回false * @throws Exception 异常信息 */ - boolean uninstall(String pluginId) throws Exception; + boolean uninstall(String pluginId, boolean isBackup) throws Exception; /** * 启用插件 [适用于生产环境、开发环境] @@ -63,6 +65,7 @@ public interface PluginOperator { /** * 上传插件并启用插件。[适用于生产环境] + * 如果在插件目录存在同名的插件包, 系统会自动备份该插件包。备份文件命名规则为;[install-backup][时间]_原jar名.jar * @param pluginFile 配置文件 * @return 成功返回true.不成功返回false, 或者抛出异常 * @throws Exception 异常信息 @@ -71,15 +74,17 @@ public interface PluginOperator { /** * 通过路径安装插件的配置文件。该文件必须存在于服务器。[适用于生产环境] + * 如果配置文件目录存在同名的配置文件, 系统会自动备份该配置文件。备份文件命名规则为;[install-config-backup][时间]_原jar名.jar * @param path 配置文件路径。 * @return 成功返回true.不成功返回false, 或者抛出异常 - * @throws Exception + * @throws Exception 安装异常 */ boolean installConfigFile(Path path) throws Exception; /** - * 上传配置文件(如果存在, 则覆盖)。[适用于生产环境] + * 上传配置文件。[适用于生产环境] + * 如果配置文件目录存在同名的配置文件, 系统会自动备份该配置文件。备份文件命名规则为;[upload-config-backup][时间]_原jar名.jar * @param configFile 配置文件 * @return 成功返回true.不成功返回false, 或者抛出异常 * @throws Exception 异常信息 @@ -89,20 +94,20 @@ public interface PluginOperator { /** * 通过路径备份文件。可备份插件和插件的配置文件。[适用于生产环境] * @param path 路径 - * @param appendName 追加的名称 + * @param sign 备份文件的自定义标识 * @return 成功返回true.不成功返回false, 或者抛出异常 * @throws Exception 异常信息 */ - boolean backupPlugin(Path path, String appendName) throws Exception; + boolean backupPlugin(Path path, String sign) throws Exception; /** * 通过插件id备份插件。[适用于生产环境] * @param pluginId 插件id - * @param appendName 追加的名称 + * @param sign 备份文件的自定义标识 * @return 成功返回true.不成功返回false, 或者抛出异常 * @throws Exception 异常信息 */ - boolean backupPlugin(String pluginId, String appendName) throws Exception; + boolean backupPlugin(String pluginId, String sign) throws Exception; /** * 获取插件信息 [适用于生产环境、开发环境] diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/operator/verify/PluginLegalVerify.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/operator/verify/PluginLegalVerify.java index d23cba7e3fb6f0a2c211b1442e0eea03ebaf20f6..f7fa541c2a92b0e6db1529eeae260294ec60a2ed 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/operator/verify/PluginLegalVerify.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/operator/verify/PluginLegalVerify.java @@ -22,23 +22,23 @@ public class PluginLegalVerify implements PluginVerify{ @Override - public Path verify(Path path) throws PluginException { + public Path verify(Path path) throws Exception { if(path == null){ - throw new PluginException("path can not be null"); + throw new IllegalArgumentException("path can not be null"); } if(!pluginDescriptorFinder.isApplicable(path)){ // 插件包不合法 - throw new PluginException(path.toString() + " : plugin illegal"); + throw new Exception(path.toString() + " : plugin illegal"); } PluginDescriptor pluginDescriptor = pluginDescriptorFinder.find(path); if(pluginDescriptor == null){ - throw new PluginException(path.toString() + " : Not found Plugin Descriptor"); + throw new Exception(path.toString() + " : Not found Plugin Descriptor"); } if(StringUtils.isEmpty(pluginDescriptor.getPluginId())){ - throw new PluginException(path.toString() + " : Not found Plugin Id"); + throw new Exception(path.toString() + " : Not found Plugin Id"); } if(StringUtils.isEmpty(pluginDescriptor.getPluginClass())){ - throw new PluginException(path.toString() + " : Not found Plugin Class"); + throw new Exception(path.toString() + " : Not found Plugin Class"); } return postVerify(path, pluginDescriptor); } @@ -48,9 +48,9 @@ public class PluginLegalVerify implements PluginVerify{ * @param path 路径 * @param pluginDescriptor 插件解析者 * @return 返回路径 - * @throws PluginException 插件异常 + * @throws Exception 插件异常 */ - protected Path postVerify(Path path, PluginDescriptor pluginDescriptor) throws PluginException{ + protected Path postVerify(Path path, PluginDescriptor pluginDescriptor) throws Exception{ return path; } diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/operator/verify/PluginUploadVerify.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/operator/verify/PluginUploadVerify.java index a8b79cd1f4e30c7ae4a314e33dcae495920ef9e2..7f3ea59461363580009b491128e9408a3993b963 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/operator/verify/PluginUploadVerify.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/operator/verify/PluginUploadVerify.java @@ -23,7 +23,7 @@ public class PluginUploadVerify extends PluginLegalVerify{ @Override - protected Path postVerify(Path path, PluginDescriptor pluginDescriptor) throws PluginException { + protected Path postVerify(Path path, PluginDescriptor pluginDescriptor) throws Exception { PluginWrapper pluginWrapper = pluginManager.getPlugin(pluginDescriptor.getPluginId()); if(pluginWrapper == null){ // 当前没有该插件包运行 @@ -36,6 +36,6 @@ public class PluginUploadVerify extends PluginLegalVerify{ .append("> ; version <").append(runPluginDescriptor.getVersion()) .append("> ) is already exist in the current environment。 ") .append("Please uninstall the plugin, then upload and update the plugin"); - throw new PluginException(errorMsg.toString()); + throw new Exception(errorMsg.toString()); } } diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/operator/verify/PluginVerify.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/operator/verify/PluginVerify.java index c63bdca8c53fa63ce6695d56fbe0fe0f264f793a..fcd967fc6898ceafb74ee95534bcd1d59ef65698 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/operator/verify/PluginVerify.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/operator/verify/PluginVerify.java @@ -1,6 +1,5 @@ package com.gitee.starblues.integration.operator.verify; -import org.pf4j.PluginException; import java.nio.file.Path; @@ -17,8 +16,8 @@ public interface PluginVerify { * 校验插件包 * @param path 插件路径 * @return 返回校验成功的路径 - * @throws PluginException 插件异常 + * @throws Exception 插件异常 */ - Path verify(Path path) throws PluginException; + Path verify(Path path) throws Exception; } diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/DefaultIntegrationFactory.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/pf4j/DefaultPf4JFactory.java similarity index 70% rename from springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/DefaultIntegrationFactory.java rename to springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/pf4j/DefaultPf4JFactory.java index 94c2833642f2dd375250828c07b65bdaa39d07b1..e52cf7cff58d0197947e0e4bb2b01717fdf8d2f4 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/DefaultIntegrationFactory.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/pf4j/DefaultPf4JFactory.java @@ -1,5 +1,6 @@ -package com.gitee.starblues.integration; +package com.gitee.starblues.integration.pf4j; +import com.gitee.starblues.integration.IntegrationConfiguration; import org.pf4j.*; import java.nio.file.Path; @@ -9,17 +10,25 @@ import java.util.Objects; /** * 默认的插件集成工厂 * @author zhangzhuo - * @version 1.0 + * @version 2.2.0 */ -public class DefaultIntegrationFactory implements IntegrationFactory { +public class DefaultPf4JFactory implements Pf4jFactory { + private final IntegrationConfiguration configuration; + + public DefaultPf4JFactory(IntegrationConfiguration configuration) { + this.configuration = configuration; + } @Override - public PluginManager getPluginManager(IntegrationConfiguration configuration) throws PluginException { + public PluginManager getPluginManager() { + if(configuration == null){ + throw new NullPointerException("IntegrationConfiguration is null"); + } RuntimeMode environment = configuration.environment(); if(environment == null){ - throw new PluginException("Run environment can is null" + configuration.environment()); + throw new RuntimeException("Configuration RuntimeMode is null" + configuration.environment()); } if(RuntimeMode.DEVELOPMENT == environment){ // 开发环境下的插件管理者 @@ -42,7 +51,7 @@ public class DefaultIntegrationFactory implements IntegrationFactory { } }; } else { - throw new PluginException("Not found run environment " + configuration.environment()); + throw new RuntimeException("Not found run environment " + configuration.environment()); } } diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/IntegrationFactory.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/pf4j/Pf4jFactory.java similarity index 34% rename from springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/IntegrationFactory.java rename to springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/pf4j/Pf4jFactory.java index f2f8d5b462290e395dedfc90ff6fb46ec05e545b..341e2ed253c8fe39be8490c32a6e217d75192a04 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/IntegrationFactory.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/pf4j/Pf4jFactory.java @@ -1,22 +1,20 @@ -package com.gitee.starblues.integration; +package com.gitee.starblues.integration.pf4j; -import org.pf4j.PluginException; +import com.gitee.starblues.integration.application.DefaultPluginApplication; import org.pf4j.PluginManager; /** - * 集成工厂 + * Pf4j 集成工厂。获取Pf4j的PluginManager对象 * @author zhangzhuo - * @version 1.0 + * @version 2.2.0 * @see DefaultPluginApplication */ -public interface IntegrationFactory { +public interface Pf4jFactory { /** * 得到插件管理者 - * @param configuration 插件配置 * @return 插件管理者 - * @throws PluginException 插件异常 */ - PluginManager getPluginManager(IntegrationConfiguration configuration) throws PluginException; + PluginManager getPluginManager(); } diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/refresh/AbstractPluginSpringBeanRefresh.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/refresh/AbstractPluginSpringBeanRefresh.java index 2d527b4cf6d328ed73c3c3d01aac03980719c47c..e0fd1b4382332f971cc6af730c69df536ce87bf9 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/refresh/AbstractPluginSpringBeanRefresh.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/refresh/AbstractPluginSpringBeanRefresh.java @@ -1,6 +1,6 @@ package com.gitee.starblues.integration.refresh; -import com.gitee.starblues.integration.PluginApplication; +import com.gitee.starblues.integration.application.PluginApplication; import java.util.List; diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/refresh/AbstractSpringBeanRefresh.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/refresh/AbstractSpringBeanRefresh.java index 8cdffce11577231e782292a91b57cd7faa869e04..8cee174cee66ee1830ef1989f1d14655b6b189af 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/refresh/AbstractSpringBeanRefresh.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/refresh/AbstractSpringBeanRefresh.java @@ -1,6 +1,6 @@ package com.gitee.starblues.integration.refresh; -import com.gitee.starblues.integration.PluginApplication; +import com.gitee.starblues.integration.application.PluginApplication; import com.gitee.starblues.integration.listener.PluginListener; import java.lang.reflect.ParameterizedType; @@ -64,6 +64,7 @@ public abstract class AbstractSpringBeanRefresh implements PluginListener { /** * 刷新bean + * @return 返回刷新后的Bean集合 */ protected List refresh(){ return pluginApplication diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/user/DefaultPluginUser.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/user/DefaultPluginUser.java index 750bf77c1027db924cd748cf05e959461a240cc8..3638eac42b93ec9d6895d33e8bf8c27d1f749fd3 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/user/DefaultPluginUser.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/user/DefaultPluginUser.java @@ -19,8 +19,8 @@ public class DefaultPluginUser implements PluginUser{ private final PluginManager pluginManager; public DefaultPluginUser(ApplicationContext applicationContext, PluginManager pluginManager) { - Objects.requireNonNull(applicationContext); - Objects.requireNonNull(pluginManager); + Objects.requireNonNull(applicationContext, "ApplicationContext can't be null"); + Objects.requireNonNull(pluginManager, "PluginManager can't be null"); this.applicationContext = (GenericApplicationContext)applicationContext; this.pluginManager = pluginManager; } diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/user/PluginUser.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/user/PluginUser.java index 37d25f8f0d639786a719bdd06f4e4c165c3c4b7b..52895fb610b6900df92e743ce4ccc51d4c6ad9a0 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/user/PluginUser.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/integration/user/PluginUser.java @@ -4,7 +4,8 @@ import java.util.List; import java.util.Map; /** - * 插件使用者 + * 该接口用于在主程序操作Spring管理的插件bean. + * 主要用途: 在主程序定义接口。插件中实现该接口做扩展, 主程序通过接口class可以获取到插件中的实现类。 * @author zhangzhuo * @version 2.0.2 */ @@ -17,6 +18,7 @@ public interface PluginUser { * @return T */ T getBean(String name); + /** * 通过aClass得到bean。(Spring管理的bean) * @param aClass class @@ -36,6 +38,10 @@ public interface PluginUser { /** * 在主程序中定义的接口。 * 插件或者主程序实现该接口。可以该方法获取到实现该接口的所有实现类。(Spring管理的bean) + * 使用场景: + * 1. 在主程序定义接口 + * 2. 在主程序和插件包中都存在实现该接口, 并使用Spring的组件注解(@Component、@Service) + * 3. 使用该方法可以获取到所以实现该接口的实现类(主程序和插件中)。 * @param aClass 接口的类 * @param bean的类型 * @return List @@ -44,7 +50,10 @@ public interface PluginUser { /** * 得到主函数中定义的类。 - * 主程序实现该接口。可以该方法获取到实现该接口的所有实现类。(Spring管理的bean) + * 使用场景: + * 1. 在主程序定义接口 + * 2. 在主程序和插件包中都存在实现该接口, 并使用Spring的组件注解(@Component、@Service) + * 3. 使用该方法可以获取到主程序实现该接口的实现类。 * @param aClass 类/接口的类 * @param bean 的类型 * @return List @@ -54,6 +63,10 @@ public interface PluginUser { /** * 在主程序中定义的接口。获取插件中实现该接口的实现类。(Spring管理的bean) + * 使用场景: + * 1. 在主程序定义接口 + * 2. 插件包中实现该接口, 并使用Spring的组件注解(@Component、@Service) + * 3. 使用该方法可以获取到插件中实现该接口的实现类(不包括主程序)。 * @param aClass 接口的类 * @param bean的类型 * @return 实现 aClass 接口的实现类的集合 @@ -62,6 +75,10 @@ public interface PluginUser { /** * 在主程序中定义的接口。获取指定插件中实现该接口的实现类。(Spring管理的bean) + * 使用场景: + * 1. 在主程序定义接口 + * 2. 插件包中实现该接口, 并使用Spring的组件注解(@Component、@Service) + * 3. 使用该方法可以获取到指定插件中实现该接口的实现类。 * @param pluginId 插件id * @param aClass 接口的类 * @param bean的类型 @@ -70,7 +87,11 @@ public interface PluginUser { List getPluginBeans(String pluginId, Class aClass); /** - * 得到插件扩展接口实现的bean。(非Spring管理) + * 使用场景: + * 1. 在主程序定义接口(该接口需要继承 ExtensionPoint 接口)。 + * 2. 插件包中实现该接口 + * 3. 在主程序可以使用该方法获取到实现该接口的实现类。(实现类可以配合 @Extension 控制顺序) + * 注意: 该场景用于非Spring管理的bean, 使用Spring注解无效 * @param tClass bean的类型 * @param bean的类型 * @return List diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/loader/PluginResourceLoadFactory.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/loader/PluginResourceLoadFactory.java index d715bce00d44c2f42dd80393cf240578785c44f6..b7f7fe29a2944a1b36c06b6214caf6958dd74bce 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/loader/PluginResourceLoadFactory.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/loader/PluginResourceLoadFactory.java @@ -1,15 +1,12 @@ package com.gitee.starblues.loader; -import com.gitee.starblues.extension.AbstractExtension; import com.gitee.starblues.extension.ExtensionFactory; import com.gitee.starblues.loader.load.PluginClassLoader; import com.gitee.starblues.realize.BasePlugin; import com.gitee.starblues.utils.CommonUtils; import com.gitee.starblues.utils.OrderPriority; -import org.pf4j.PluginException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.core.io.Resource; import org.springframework.util.StringUtils; import java.util.ArrayList; @@ -21,13 +18,13 @@ import java.util.concurrent.ConcurrentHashMap; * 插件资源加载者 * * @author zhangzhuo - * @version 1.0 + * @version 2.2.0 */ public class PluginResourceLoadFactory { private static final Logger LOG = LoggerFactory.getLogger(PluginResourceLoadFactory.class); - private final Map> pluginResourceMap = new ConcurrentHashMap<>(); + private final Map pluginResourceWrappers = new ConcurrentHashMap<>(); private final List pluginResourceLoaders = new ArrayList<>(5); @@ -58,16 +55,15 @@ public class PluginResourceLoadFactory { }); } - - - /** * 加载插件类 - * @param basePlugin basePlugin - * @throws PluginException PluginException + * @param basePlugin 当前插件信息 */ - public synchronized void load(BasePlugin basePlugin) throws PluginException { + public synchronized void load(BasePlugin basePlugin) { for (PluginResourceLoader pluginResourceLoader : pluginResourceLoaders) { + if(pluginResourceLoader == null){ + continue; + } String key = pluginResourceLoader.key(); if(StringUtils.isEmpty(key)){ LOG.error("pluginResourceLoader {} key is empty, skip!", @@ -75,24 +71,45 @@ public class PluginResourceLoadFactory { continue; } try { - List resources = pluginResourceLoader.load(basePlugin); - if(resources != null){ - pluginResourceMap.put(key, resources); + ResourceWrapper resourceWrapper = pluginResourceLoader.load(basePlugin); + if(resourceWrapper != null){ + pluginResourceWrappers.put(key, resourceWrapper); } - } catch (Exception e) { - e.printStackTrace(); - throw new PluginException(e.getMessage()); + } catch (Exception e){ + LOG.error("Plugin resource loader '{}' load error. {}", key, e.getMessage(), e); } + } } + /** + * 卸载加载者加载的资源 + * @param basePlugin 当前插件信息 + */ + public synchronized void unload(BasePlugin basePlugin) { + for (PluginResourceLoader pluginResourceLoader : pluginResourceLoaders) { + if(pluginResourceLoader == null){ + continue; + } + String key = pluginResourceLoader.key(); + try { + ResourceWrapper resourceWrapper = pluginResourceWrappers.get(key); + pluginResourceLoader.unload(basePlugin, resourceWrapper); + } catch (Exception e){ + LOG.error("Plugin resource loader '{}' unload error. {}", key, e.getMessage(), e); + } + } + } + + + /** * 根据资源加载者的key获取插件资源 * @param key key - * @return List + * @return ResourceWrapper */ - public List getPluginResources(String key) { - return pluginResourceMap.get(key); + public ResourceWrapper getPluginResources(String key) { + return pluginResourceWrappers.get(key); } diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/loader/PluginResourceLoader.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/loader/PluginResourceLoader.java index 21aac94231a0e0aaef65a5d68aeacc6c41cfacac..567d748f8454ccb4d7571848511f9cee9ad47f04 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/loader/PluginResourceLoader.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/loader/PluginResourceLoader.java @@ -10,7 +10,7 @@ import java.util.List; * 插件资源加载者统一定义的接口 * * @author zhangzhuo - * @version 1.0 + * @version 2.2.0 */ public interface PluginResourceLoader { @@ -23,11 +23,20 @@ public interface PluginResourceLoader { /** * 加载资源 - * @param basePlugin basePlugin - * @return List + * @param basePlugin 插件对象 + * @return 资源包装对象 * @throws Exception Exception */ - List load(BasePlugin basePlugin) throws Exception; + ResourceWrapper load(BasePlugin basePlugin) throws Exception; + + /** + * 卸载时的操作 + * @param basePlugin 插件对象 + * @param resourceWrapper 资源包装者 + * @throws Exception 卸载异常 + */ + void unload(BasePlugin basePlugin, ResourceWrapper resourceWrapper) throws Exception; + /** * 执行顺序 diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/loader/ResourceWrapper.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/loader/ResourceWrapper.java new file mode 100644 index 0000000000000000000000000000000000000000..74749ffc3cd33a53cbb6b68baf432d538a9cc531 --- /dev/null +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/loader/ResourceWrapper.java @@ -0,0 +1,53 @@ +package com.gitee.starblues.loader; + +import org.springframework.core.io.Resource; + +import java.util.*; + +/** + * 资源包装类 + * + * @author zhangzhuo + * @version 2.2.0 + */ +public class ResourceWrapper { + + private final List resources; + private final Map extensions = new HashMap<>(); + + + public ResourceWrapper() { + this.resources = new ArrayList<>(0); + } + + public ResourceWrapper(List resources) { + if(resources == null){ + this.resources = new ArrayList<>(0); + } else { + this.resources = resources; + } + } + + public ResourceWrapper(Resource[] resources) { + if(resources != null){ + this.resources = Arrays.asList(resources); + } else { + this.resources = new ArrayList<>(0); + } + } + + public List getResources(){ + return resources; + } + + + public void addExtension(String key, Object value) { + extensions.put(key, value); + } + + public Object getExtension(String key){ + return extensions.get(key); + } + + +} diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/loader/load/PluginClassLoader.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/loader/load/PluginClassLoader.java index 08b1efe6d325edb6628a09c9083d37b8cc92c0b0..6b6e87baf18e0b0c85482448b9264213b05e54ba 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/loader/load/PluginClassLoader.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/loader/load/PluginClassLoader.java @@ -1,6 +1,7 @@ package com.gitee.starblues.loader.load; import com.gitee.starblues.loader.PluginResourceLoader; +import com.gitee.starblues.loader.ResourceWrapper; import com.gitee.starblues.realize.BasePlugin; import com.gitee.starblues.utils.OrderExecution; import com.gitee.starblues.utils.OrderPriority; @@ -17,7 +18,7 @@ import java.util.List; * 插件类文件加载者 * * @author zhangzhuo - * @version 1.0 + * @version 2.2.0 */ public class PluginClassLoader implements PluginResourceLoader { @@ -29,7 +30,7 @@ public class PluginClassLoader implements PluginResourceLoader { } @Override - public List load(BasePlugin basePlugin) throws Exception{ + public ResourceWrapper load(BasePlugin basePlugin) throws Exception{ String scanPackage = basePlugin.scanPackage(); String packageSearchPath = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX + ClassUtils.convertClassNameToResourcePath(scanPackage) + @@ -38,9 +39,14 @@ public class PluginClassLoader implements PluginResourceLoader { new PathMatchingResourcePatternResolver(basePlugin.getWrapper().getPluginClassLoader()); Resource[] resources = resourcePatternResolver.getResources(packageSearchPath); if(resources == null){ - return Collections.emptyList(); + return new ResourceWrapper(); } - return Arrays.asList(resources); + return new ResourceWrapper(resources); + } + + @Override + public void unload(BasePlugin basePlugin, ResourceWrapper resourceWrapper) throws Exception { + // Do nothing } @Override diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/loader/load/PluginConfigFileLoader.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/loader/load/PluginConfigFileLoader.java index cf4671875f466bf5f3ce3e89607f61acbbd9e006..5f2bdc21c82d8f8d15771f60ef8270a3b04ae1ae 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/loader/load/PluginConfigFileLoader.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/loader/load/PluginConfigFileLoader.java @@ -1,6 +1,7 @@ package com.gitee.starblues.loader.load; import com.gitee.starblues.loader.PluginResourceLoader; +import com.gitee.starblues.loader.ResourceWrapper; import com.gitee.starblues.realize.BasePlugin; import com.gitee.starblues.utils.OrderExecution; import com.gitee.starblues.utils.OrderPriority; @@ -17,7 +18,7 @@ import java.util.List; * 插件配置文件加载者 * * @author zhangzhuo - * @version 1.0 + * @version 2.2.0 */ public class PluginConfigFileLoader implements PluginResourceLoader { @@ -40,7 +41,7 @@ public class PluginConfigFileLoader implements PluginResourceLoader { } @Override - public List load(BasePlugin basePlugin) throws Exception { + public ResourceWrapper load(BasePlugin basePlugin) throws Exception { Resource resource; if(runtimeMode == RuntimeMode.DEVELOPMENT){ // 开发环境下 @@ -54,7 +55,12 @@ public class PluginConfigFileLoader implements PluginResourceLoader { } List resources = new ArrayList<>(); resources.add(resource); - return resources; + return new ResourceWrapper(resources); + } + + @Override + public void unload(BasePlugin basePlugin, ResourceWrapper resourceWrapper) throws Exception { + // Do nothing } @Override 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 0d1e8917933ad693a4a9ff84ee7afaac38128cdc..40683ba70ac8cb083095d371742a11ba63b4c324 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 @@ -2,13 +2,12 @@ package com.gitee.starblues.realize; import com.gitee.starblues.loader.PluginResourceLoadFactory; import org.pf4j.Plugin; -import org.pf4j.PluginException; import org.pf4j.PluginWrapper; /** * 插件包要继承的抽象类 * @author zhangzhuo - * @version 1.0 + * @version 2.2.0 */ public abstract class BasePlugin extends Plugin { @@ -21,45 +20,47 @@ public abstract class BasePlugin extends Plugin { @Override - public final void start() throws PluginException { - pluginResourceLoadFactory.load(this); + public final void start() { + try { + startEvent(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + pluginResourceLoadFactory.load(this); + } } @Override - public final void delete() throws PluginException { - deleteEvent(); + public final void delete() { + try { + deleteEvent(); + } catch (Exception e){ + e.printStackTrace(); + } finally { + pluginResourceLoadFactory.unload(this); + } + } @Override public final void stop() { - stopEvent(); + try { + stopEvent(); + } catch (Exception e){ + e.printStackTrace(); + } finally { + pluginResourceLoadFactory.unload(this); + } } - - /** - * 启动事件 - * @throws PluginException PluginException - */ - protected abstract void startEvent() throws PluginException; - - /** - * 删除事件 - * @throws PluginException PluginException - */ - protected abstract void deleteEvent() throws PluginException; - - /** - * 停止事件 - */ - protected abstract void stopEvent(); - /** * 扫描包。默认为当前类包名。可重写自定义包名 * @return 包名 */ public String scanPackage(){ - return this.getCurrentPackageName(); + // 获取当前实现类的包名 + return this.getClass().getPackage().getName(); } @@ -71,12 +72,20 @@ public abstract class BasePlugin extends Plugin { return pluginResourceLoadFactory; } + /** - * 获取当前实现类的包名 - * @return 包名 + * 启动事件. Spring 容器都没有准备。无法使用注入。 */ - private String getCurrentPackageName(){ - return this.getClass().getPackage().getName(); - } + protected abstract void startEvent(); + + /** + * 删除事件. 在插件删除时触发。 + */ + protected abstract void deleteEvent(); + + /** + * 停止事件. 在插件停止时触发。 + */ + protected abstract void stopEvent(); } diff --git a/springboot-plugin-framework/src/main/java/com/gitee/starblues/utils/GlobalRegistryInfo.java b/springboot-plugin-framework/src/main/java/com/gitee/starblues/utils/GlobalRegistryInfo.java index d31114ad3a5c6e891e72f7be3c2b4bfa1604be53..0522ca06c8859de2a9e2613bc89be49c73d1c3ce 100644 --- a/springboot-plugin-framework/src/main/java/com/gitee/starblues/utils/GlobalRegistryInfo.java +++ b/springboot-plugin-framework/src/main/java/com/gitee/starblues/utils/GlobalRegistryInfo.java @@ -1,6 +1,8 @@ package com.gitee.starblues.utils; +import com.gitee.starblues.integration.IntegrationConfiguration; + import java.util.HashMap; import java.util.Map; @@ -8,14 +10,12 @@ import java.util.Map; * 全局注册信息 * * @author zhangzhuo - * @version 1.0 + * @version 2.2.0 */ public final class GlobalRegistryInfo { private GlobalRegistryInfo(){} - - /** * 全局插件安装次数 */ @@ -27,10 +27,11 @@ public final class GlobalRegistryInfo { private static Map extensionMap = new HashMap<>(); - /** * 添加操作插件信息 * @param pluginId 插件id + * @param operatorType 操作类型 + * @param isLock 是否加锁 */ public static synchronized void addOperatorPluginInfo(String pluginId, PluginOperatorInfo.OperatorType operatorType, @@ -45,6 +46,11 @@ public final class GlobalRegistryInfo { } + /** + * 设置操作插件的信息 + * @param pluginId 插件id + * @param isLock 是否加锁 + */ public static synchronized void setOperatorPluginInfo(String pluginId, boolean isLock){ PluginOperatorInfo operatorPluginInfo = operatorPluginInfos.get(pluginId); if(operatorPluginInfo != null){ 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 9f7d07eb17245b1855f85f83c09650d83e22c4ec..f503465030a931f1e08fbca3eeff09a79df2e68a 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 @@ -6,7 +6,7 @@ import java.util.concurrent.atomic.AtomicBoolean; * 操作插件信息。为了解决连续上传安装后, 停止后, 无法启动的问题。 * * @author zhangzhuo - * @version 1.0 + * @version 2.2.0 */ public class PluginOperatorInfo {