From d7cfe4c4a5643175daffe457aebb96f808262a0a Mon Sep 17 00:00:00 2001 From: guqing <38999863+guqing@users.noreply.github.com> Date: Mon, 27 Jun 2022 15:14:10 +0800 Subject: [PATCH] refactor: Unstructured loading opportunity for plugin (#2191) * refactor: Unstructured loading opportunity for plugin * refactor: gvk --- .../halo/app/plugin/PluginLoadedListener.java | 32 ++-------- .../app/plugin/PluginStartedListener.java | 61 +++++++++++++++++++ 2 files changed, 66 insertions(+), 27 deletions(-) create mode 100644 src/main/java/run/halo/app/plugin/PluginStartedListener.java diff --git a/src/main/java/run/halo/app/plugin/PluginLoadedListener.java b/src/main/java/run/halo/app/plugin/PluginLoadedListener.java index e9f7193e5..64fbf7655 100644 --- a/src/main/java/run/halo/app/plugin/PluginLoadedListener.java +++ b/src/main/java/run/halo/app/plugin/PluginLoadedListener.java @@ -1,16 +1,10 @@ package run.halo.app.plugin; -import java.util.HashMap; -import java.util.List; -import java.util.Map; import org.pf4j.PluginWrapper; import org.springframework.context.ApplicationListener; -import org.springframework.core.io.DefaultResourceLoader; -import org.springframework.core.io.Resource; import org.springframework.stereotype.Component; import run.halo.app.core.extension.Plugin; import run.halo.app.extension.ExtensionClient; -import run.halo.app.infra.utils.YamlUnstructuredLoader; import run.halo.app.plugin.event.HaloPluginLoadedEvent; /** @@ -32,26 +26,10 @@ public class PluginLoadedListener implements ApplicationListener new YamlUnstructuredLoader(resource).load()) - .flatMap(List::stream) - .forEach(unstructured -> { - Map labels = unstructured.getMetadata().getLabels(); - if (labels == null) { - unstructured.getMetadata().setLabels(new HashMap<>()); - } - unstructured.getMetadata() - .getLabels() - .put(PluginConst.PLUGIN_NAME_LABEL_NAME, plugin.getMetadata().getName()); - extensionClient.create(unstructured); - }); + extensionClient.fetch(Plugin.class, plugin.getMetadata().getName()) + .ifPresentOrElse(persisted -> { + plugin.getMetadata().setVersion(persisted.getMetadata().getVersion()); + extensionClient.update(plugin); + }, () -> extensionClient.create(plugin)); } } diff --git a/src/main/java/run/halo/app/plugin/PluginStartedListener.java b/src/main/java/run/halo/app/plugin/PluginStartedListener.java new file mode 100644 index 000000000..137ec4ff7 --- /dev/null +++ b/src/main/java/run/halo/app/plugin/PluginStartedListener.java @@ -0,0 +1,61 @@ +package run.halo.app.plugin; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import org.pf4j.PluginWrapper; +import org.springframework.context.ApplicationListener; +import org.springframework.core.io.DefaultResourceLoader; +import org.springframework.core.io.Resource; +import org.springframework.stereotype.Component; +import run.halo.app.core.extension.Plugin; +import run.halo.app.extension.ExtensionClient; +import run.halo.app.extension.MetadataOperator; +import run.halo.app.infra.utils.YamlUnstructuredLoader; +import run.halo.app.plugin.event.HaloPluginStartedEvent; + +/** + * TODO Optimized Unstructured loading. + * + * @author guqing + * @since 2.0.0 + */ +@Component +public class PluginStartedListener implements ApplicationListener { + + private final ExtensionClient extensionClient; + + public PluginStartedListener(ExtensionClient extensionClient) { + this.extensionClient = extensionClient; + } + + @Override + public void onApplicationEvent(HaloPluginStartedEvent event) { + PluginWrapper pluginWrapper = event.getPlugin(); + Plugin plugin = + extensionClient.fetch(Plugin.class, pluginWrapper.getPluginId()).orElseThrow(); + // load unstructured + DefaultResourceLoader resourceLoader = + new DefaultResourceLoader(pluginWrapper.getPluginClassLoader()); + plugin.getSpec().getExtensionLocations() + .stream() + .map(resourceLoader::getResource) + .filter(Resource::exists) + .map(resource -> new YamlUnstructuredLoader(resource).load()) + .flatMap(List::stream) + .forEach(unstructured -> { + MetadataOperator metadata = unstructured.getMetadata(); + Map labels = metadata.getLabels(); + if (labels == null) { + labels = new HashMap<>(); + metadata.setLabels(labels); + } + labels.put(PluginConst.PLUGIN_NAME_LABEL_NAME, plugin.getMetadata().getName()); + extensionClient.fetch(unstructured.groupVersionKind(), metadata.getName()) + .ifPresentOrElse(persisted -> { + unstructured.getMetadata().setVersion(persisted.getMetadata().getVersion()); + extensionClient.update(unstructured); + }, () -> extensionClient.create(unstructured)); + }); + } +}