mirror of
https://github.com/DanilaFe/abacus
synced 2025-01-09 23:58:09 -08:00
Implement a PluginLoader, which can load plugin jars.
This commit is contained in:
parent
f119f19c04
commit
1190ece7dd
106
src/org/nwapw/abacus/plugin/PluginLoader.java
Normal file
106
src/org/nwapw/abacus/plugin/PluginLoader.java
Normal file
@ -0,0 +1,106 @@
|
||||
package org.nwapw.abacus.plugin;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.net.URL;
|
||||
import java.net.URLClassLoader;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Properties;
|
||||
import java.util.jar.JarFile;
|
||||
|
||||
/**
|
||||
* A plugin loader, used to scan a directory for
|
||||
* plugins and load them into classes that can then be
|
||||
* used by the plugin manager.
|
||||
*/
|
||||
public class PluginLoader {
|
||||
|
||||
/**
|
||||
* An internal class that represents a Jar file that
|
||||
* has been founded, but not loaded.
|
||||
*/
|
||||
private static final class PluginEntry {
|
||||
String mainClass;
|
||||
File jarPath;
|
||||
}
|
||||
|
||||
/**
|
||||
* The path which to search for plugins.
|
||||
*/
|
||||
private File path;
|
||||
/**
|
||||
* The array of loaded plugin main classes.
|
||||
*/
|
||||
private ArrayList<Class<?>> foundMainClasses;
|
||||
|
||||
/**
|
||||
* Creates a new plugin loader at the given path.
|
||||
* @param path the path which to search for plugins.
|
||||
*/
|
||||
public PluginLoader(File path) {
|
||||
this.path = path;
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads all the plugin classes that have been found.
|
||||
* @return the list of loaded classes.
|
||||
* @throws IOException thrown when loading classes from URL fails.
|
||||
* @throws ClassNotFoundException thrown when the class specified in plugin.properties is missing.
|
||||
*/
|
||||
private ArrayList<Class<?>> loadPluginClasses() throws IOException, ClassNotFoundException {
|
||||
ArrayList<Class<?>> foundMainClasses = new ArrayList<>();
|
||||
for(PluginEntry entry : findPlugins()){
|
||||
if(entry.mainClass == null) continue;
|
||||
ClassLoader loader = URLClassLoader.newInstance(
|
||||
new URL[]{ entry.jarPath.toURI().toURL() },
|
||||
getClass().getClassLoader());
|
||||
Class<?> loadedClass = loader.loadClass(entry.mainClass);
|
||||
if(!Plugin.class.isAssignableFrom(loadedClass)) continue;
|
||||
foundMainClasses.add(loadedClass);
|
||||
}
|
||||
return foundMainClasses;
|
||||
}
|
||||
|
||||
/**
|
||||
* Find all jars that have a plugin.properties file in the plugin folder.
|
||||
* @return the list of all plugin entries, with their main class names and the jars files.
|
||||
* @throws IOException thrown if reading the jar file fails
|
||||
*/
|
||||
private ArrayList<PluginEntry> findPlugins() throws IOException {
|
||||
ArrayList<PluginEntry> pluginEntries = new ArrayList<>();
|
||||
File[] childFiles = path.listFiles();
|
||||
|
||||
if(childFiles == null) return pluginEntries;
|
||||
for(File file : childFiles){
|
||||
if(!file.isFile() || !file.getName().endsWith(".jar")) continue;
|
||||
JarFile jarFile = new JarFile(file);
|
||||
if(jarFile.getEntry("plugin.properties") == null) continue;
|
||||
Properties properties = new Properties();
|
||||
properties.load(jarFile.getInputStream(jarFile.getEntry("plugin.properties")));
|
||||
|
||||
PluginEntry entry = new PluginEntry();
|
||||
entry.mainClass = properties.getProperty("mainClass");
|
||||
entry.jarPath = file;
|
||||
pluginEntries.add(entry);
|
||||
}
|
||||
return pluginEntries;
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads all valid plugins and keeps track of them.
|
||||
* @throws IOException thrown if loading from jar files fails.
|
||||
* @throws ClassNotFoundException thrown if class specified in plugin.properties doesn't exist.
|
||||
*/
|
||||
public void loadValidPlugins() throws IOException, ClassNotFoundException {
|
||||
foundMainClasses = loadPluginClasses();
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the list of all the plugins that have last been loaded.
|
||||
* @return the list of loaded class files.
|
||||
*/
|
||||
public ArrayList<Class<?>> getFoundMainClasses() {
|
||||
return foundMainClasses;
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in New Issue
Block a user