diff --git a/src/main/java/run/halo/app/core/extension/Plugin.java b/src/main/java/run/halo/app/core/extension/Plugin.java index 53701e51b..67803f3d5 100644 --- a/src/main/java/run/halo/app/core/extension/Plugin.java +++ b/src/main/java/run/halo/app/core/extension/Plugin.java @@ -16,7 +16,6 @@ import org.pf4j.PluginState; import org.springframework.lang.NonNull; import run.halo.app.extension.AbstractExtension; import run.halo.app.extension.GVK; -import run.halo.app.plugin.BasePlugin; /** * A custom resource for Plugin. @@ -74,7 +73,8 @@ public class Plugin extends AbstractExtension { */ private String requires = "*"; - private String pluginClass = BasePlugin.class.getName(); + @Deprecated + private String pluginClass; private Boolean enabled = false; diff --git a/src/main/java/run/halo/app/core/extension/reconciler/PluginReconciler.java b/src/main/java/run/halo/app/core/extension/reconciler/PluginReconciler.java index 0205a0596..d02254392 100644 --- a/src/main/java/run/halo/app/core/extension/reconciler/PluginReconciler.java +++ b/src/main/java/run/halo/app/core/extension/reconciler/PluginReconciler.java @@ -173,7 +173,7 @@ public class PluginReconciler implements Reconciler { private void ensureSpecUpToDateWhenDevelopmentMode(PluginWrapper pluginWrapper, Plugin oldPlugin) { - if (!RuntimeMode.DEPLOYMENT.equals(pluginWrapper.getRuntimeMode())) { + if (RuntimeMode.DEPLOYMENT.equals(pluginWrapper.getRuntimeMode())) { return; } YamlPluginFinder yamlPluginFinder = new YamlPluginFinder(); diff --git a/src/main/java/run/halo/app/plugin/BasePlugin.java b/src/main/java/run/halo/app/plugin/BasePlugin.java index b0476792a..7568fd836 100644 --- a/src/main/java/run/halo/app/plugin/BasePlugin.java +++ b/src/main/java/run/halo/app/plugin/BasePlugin.java @@ -35,7 +35,7 @@ public class BasePlugin extends Plugin { return applicationContext; } - public HaloPluginManager getPluginManager() { + private HaloPluginManager getPluginManager() { return (HaloPluginManager) getWrapper().getPluginManager(); } } diff --git a/src/main/java/run/halo/app/plugin/BasePluginFactory.java b/src/main/java/run/halo/app/plugin/BasePluginFactory.java new file mode 100644 index 000000000..805f7e99f --- /dev/null +++ b/src/main/java/run/halo/app/plugin/BasePluginFactory.java @@ -0,0 +1,48 @@ +package run.halo.app.plugin; + +import java.util.Optional; +import lombok.extern.slf4j.Slf4j; +import org.pf4j.Plugin; +import org.pf4j.PluginFactory; +import org.pf4j.PluginWrapper; +import org.springframework.beans.factory.NoSuchBeanDefinitionException; +import org.springframework.beans.factory.support.DefaultListableBeanFactory; + +/** + * The default implementation for PluginFactory. + *

Get a {@link BasePlugin} instance from the {@link PluginApplicationContext}.

+ * + * @author guqing + * @since 2.0.0 + */ +@Slf4j +public class BasePluginFactory implements PluginFactory { + + @Override + public Plugin create(PluginWrapper pluginWrapper) { + return getPluginContext(pluginWrapper) + .map(context -> { + try { + return context.getBean(BasePlugin.class); + } catch (NoSuchBeanDefinitionException e) { + log.info( + "No bean named 'basePlugin' found in the context create default instance"); + DefaultListableBeanFactory beanFactory = + context.getDefaultListableBeanFactory(); + BasePlugin pluginInstance = new BasePlugin(pluginWrapper); + beanFactory.registerSingleton(Plugin.class.getName(), pluginInstance); + return pluginInstance; + } + }) + .orElse(null); + } + + private Optional getPluginContext(PluginWrapper pluginWrapper) { + try { + return Optional.of(ExtensionContextRegistry.getInstance()) + .map(registry -> registry.getByPluginId(pluginWrapper.getPluginId())); + } catch (IllegalArgumentException e) { + return Optional.empty(); + } + } +} diff --git a/src/main/java/run/halo/app/plugin/HaloPluginManager.java b/src/main/java/run/halo/app/plugin/HaloPluginManager.java index 6107b9f8f..f99868db7 100644 --- a/src/main/java/run/halo/app/plugin/HaloPluginManager.java +++ b/src/main/java/run/halo/app/plugin/HaloPluginManager.java @@ -14,6 +14,7 @@ import org.pf4j.ExtensionFinder; import org.pf4j.PluginDependency; import org.pf4j.PluginDescriptor; import org.pf4j.PluginDescriptorFinder; +import org.pf4j.PluginFactory; import org.pf4j.PluginRepository; import org.pf4j.PluginRuntimeException; import org.pf4j.PluginState; @@ -80,6 +81,11 @@ public class HaloPluginManager extends DefaultPluginManager return pluginApplicationInitializer.getPluginApplicationContext(pluginId); } + @Override + protected PluginFactory createPluginFactory() { + return new BasePluginFactory(); + } + @Override public void afterPropertiesSet() { this.pluginApplicationInitializer = new PluginApplicationInitializer(this); diff --git a/src/main/java/run/halo/app/plugin/PluginApplicationInitializer.java b/src/main/java/run/halo/app/plugin/PluginApplicationInitializer.java index a9f9b5ebd..01545f8e2 100644 --- a/src/main/java/run/halo/app/plugin/PluginApplicationInitializer.java +++ b/src/main/java/run/halo/app/plugin/PluginApplicationInitializer.java @@ -66,6 +66,8 @@ public class PluginApplicationInitializer { AnnotationConfigUtils.registerAnnotationConfigProcessors(beanFactory); stopWatch.stop(); + beanFactory.registerSingleton("pluginWrapper", haloPluginManager.getPlugin(pluginId)); + populateSettingFetcher(pluginId, beanFactory); log.debug("Total millis: {} ms -> {}", stopWatch.getTotalTimeMillis(), diff --git a/src/main/java/run/halo/app/plugin/YamlPluginDescriptorFinder.java b/src/main/java/run/halo/app/plugin/YamlPluginDescriptorFinder.java index 342fb52a6..373daaab9 100644 --- a/src/main/java/run/halo/app/plugin/YamlPluginDescriptorFinder.java +++ b/src/main/java/run/halo/app/plugin/YamlPluginDescriptorFinder.java @@ -50,7 +50,7 @@ public class YamlPluginDescriptorFinder implements PluginDescriptorFinder { DefaultPluginDescriptor defaultPluginDescriptor = new DefaultPluginDescriptor(pluginId, spec.getDescription(), - spec.getPluginClass(), + BasePlugin.class.getName(), spec.getVersion(), spec.getRequires(), spec.getAuthor(), diff --git a/src/test/java/run/halo/app/core/extension/reconciler/PluginReconcilerTest.java b/src/test/java/run/halo/app/core/extension/reconciler/PluginReconcilerTest.java index bc378c720..d5a7dbc08 100644 --- a/src/test/java/run/halo/app/core/extension/reconciler/PluginReconcilerTest.java +++ b/src/test/java/run/halo/app/core/extension/reconciler/PluginReconcilerTest.java @@ -19,6 +19,7 @@ import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import org.pf4j.PluginState; import org.pf4j.PluginWrapper; +import org.pf4j.RuntimeMode; import run.halo.app.core.extension.Plugin; import run.halo.app.extension.ExtensionClient; import run.halo.app.extension.controller.Reconciler; @@ -53,6 +54,7 @@ class PluginReconcilerTest { pluginReconciler = new PluginReconciler(extensionClient, haloPluginManager, jsBundleRule); when(haloPluginManager.getPlugin(any())).thenReturn(pluginWrapper); + when(pluginWrapper.getRuntimeMode()).thenReturn(RuntimeMode.DEPLOYMENT); when(haloPluginManager.getUnresolvedPlugins()).thenReturn(List.of()); } diff --git a/src/test/java/run/halo/app/plugin/YamlPluginFinderTest.java b/src/test/java/run/halo/app/plugin/YamlPluginFinderTest.java index 8283c10d6..f57498666 100644 --- a/src/test/java/run/halo/app/plugin/YamlPluginFinderTest.java +++ b/src/test/java/run/halo/app/plugin/YamlPluginFinderTest.java @@ -92,7 +92,7 @@ class YamlPluginFinderTest { } ], "requires": ">=2.0.0", - "pluginClass": "run.halo.app.plugin.BasePlugin", + "pluginClass": null, "enabled": false, "extensionLocations": null, settingName: null,