Skip to content

Commit

Permalink
refactor: plugin resource loading to only load from plugin itself ins…
Browse files Browse the repository at this point in the history
…tead of delegating to core
  • Loading branch information
guqing committed Sep 18, 2023
1 parent da2d56e commit 80c3f1c
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 5 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package run.halo.app.plugin;

import java.io.IOException;
import java.net.URL;
import java.util.Enumeration;
import lombok.extern.slf4j.Slf4j;
import org.pf4j.ClassLoadingStrategy;
import org.pf4j.PluginClassLoader;
import org.pf4j.PluginDescriptor;
import org.pf4j.PluginManager;

/**
* <p>Plugin manager should create one instance of this class for every available plugin. By
* default, this class loader is a Parent First ClassLoader - it loads the classes from the
* parent class loader before loads from the plugin. Use classLoadingStrategy to change
* the loading strategy.</p>
* <p>By default, this class loader loads the resources from the plugin only - if the resource not
* found in the plugin, it returns null.</p>
*
* @author guqing
* @since 2.10.0
*/
@Slf4j
public class DefaultPluginClassLoader extends PluginClassLoader {
public DefaultPluginClassLoader(PluginManager pluginManager, PluginDescriptor pluginDescriptor,
ClassLoader parent) {
super(pluginManager, pluginDescriptor, parent, ClassLoadingStrategy.APD);
}

@Override
public URL getResource(String name) {
log.trace("Received request to load resource '{}'", name);
return this.findResource(name);
}

@Override
public Enumeration<URL> getResources(String name) throws IOException {
return this.findResources(name);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@
import java.time.Instant;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.pf4j.ClassLoadingStrategy;
import org.pf4j.CompoundPluginLoader;
import org.pf4j.CompoundPluginRepository;
import org.pf4j.DefaultPluginRepository;
Expand Down Expand Up @@ -114,8 +113,8 @@ protected PluginLoader createPluginLoader() {
@Override
protected PluginClassLoader createPluginClassLoader(Path pluginPath,
PluginDescriptor pluginDescriptor) {
return new PluginClassLoader(pluginManager, pluginDescriptor,
getClass().getClassLoader(), ClassLoadingStrategy.APD);
return new DefaultPluginClassLoader(pluginManager,
pluginDescriptor, getClass().getClassLoader());
}

@Override
Expand All @@ -141,8 +140,8 @@ public ClassLoader loadPlugin(Path pluginPath,
public ClassLoader loadPlugin(Path pluginPath,
PluginDescriptor pluginDescriptor) {
PluginClassLoader pluginClassLoader =
new PluginClassLoader(pluginManager, pluginDescriptor,
getClass().getClassLoader(), ClassLoadingStrategy.APD);
new DefaultPluginClassLoader(pluginManager,
pluginDescriptor, getClass().getClassLoader());
pluginClassLoader.addFile(pluginPath.toFile());
return pluginClassLoader;

Expand Down

0 comments on commit 80c3f1c

Please sign in to comment.