diff --git a/src/org/nwapw/abacus/Abacus.java b/src/org/nwapw/abacus/Abacus.java index e64342f..4d50e38 100644 --- a/src/org/nwapw/abacus/Abacus.java +++ b/src/org/nwapw/abacus/Abacus.java @@ -6,7 +6,6 @@ import org.nwapw.abacus.window.Window; import org.nwapw.abacus.plugin.ClassFinder; import javax.swing.*; -import java.io.File; import java.io.IOException; import java.util.ArrayList; @@ -26,24 +25,9 @@ public class Abacus { e.printStackTrace(); } manager = new PluginManager(); - ArrayList names = new ArrayList<>(); try { - - ClassFinder classFinder = new ClassFinder(); - File pluginFile = new File("plugins"); - for(File classes:pluginFile.listFiles()){ - if(classes.getName().endsWith(".jar")){ - names.addAll(classFinder.addJar(classes)); - } - } - for(String name:names){ - System.out.println(name); - } - ArrayList classes = classFinder.getClasses(); - for(Class classGet:classes){ - manager.addClass(classGet); - } - + ClassFinder.loadJars("plugins") + .forEach(plugin -> manager.addClass(plugin)); } catch (IOException | ClassNotFoundException e) { e.printStackTrace(); } diff --git a/src/org/nwapw/abacus/plugin/ClassFinder.java b/src/org/nwapw/abacus/plugin/ClassFinder.java index 7e530d8..521b55e 100644 --- a/src/org/nwapw/abacus/plugin/ClassFinder.java +++ b/src/org/nwapw/abacus/plugin/ClassFinder.java @@ -4,48 +4,56 @@ import java.io.File; import java.io.IOException; import java.net.URL; import java.net.URLClassLoader; +import java.nio.file.Files; +import java.nio.file.Path; import java.util.ArrayList; import java.util.Enumeration; import java.util.jar.JarEntry; import java.util.jar.JarFile; +import java.util.stream.Collectors; +/** + * Class that loads plugin classes from their jars. + */ public class ClassFinder { - ArrayList classes; - URL[] urls; - public ClassFinder(){ - classes = new ArrayList(); + + public static ArrayList> loadJars(String filePath) throws IOException, ClassNotFoundException { + return loadJars(new File(filePath)); } - public ArrayList addJar(String path) throws IOException, ClassNotFoundException { - //urls = new URL[]{new URL("jar:file:" + path + "!/")}; - return addJar(new File(path)); + + public static ArrayList> loadJars(File pluginFolderPath) throws IOException, ClassNotFoundException { + ArrayList> toReturn = new ArrayList<>(); + if(!pluginFolderPath.exists()) return toReturn; + ArrayList files = Files.walk(pluginFolderPath.toPath()) + .map(Path::toFile) + .filter(f -> f.getName().endsWith(".jar")) + .collect(Collectors.toCollection(ArrayList::new)); + for (File file : files){ + toReturn.addAll(loadJar(file)); + } + return toReturn; } - public ArrayList addJar(File jarLocation) throws IOException, ClassNotFoundException { + + public static ArrayList> loadJar(String path) throws IOException, ClassNotFoundException { + return loadJar(new File(path)); + } + + public static ArrayList> loadJar(File jarLocation) throws IOException, ClassNotFoundException { + ArrayList> loadedClasses = new ArrayList<>(); String path = jarLocation.getPath(); - urls = new URL[]{new URL("jar:file:" + path + "!/")}; + URL[] urls = new URL[]{new URL("jar:file:" + path + "!/")}; + URLClassLoader classLoader = URLClassLoader.newInstance(urls); JarFile jarFolder = new JarFile(jarLocation); - Enumeration jarList = jarFolder.entries(); - ArrayList classNames = new ArrayList(); - while(jarList.hasMoreElements()){ - JarEntry tempJar = (JarEntry)jarList.nextElement(); - if(tempJar.getName().endsWith(".class")){ - //System.out.println(tempJar.getName()); - classNames.add(tempJar.getName()); - classes.add(classLoader.loadClass(tempJar.getName().replace('/','.').substring(0,tempJar.getName().length()-6))); + Enumeration jarEntityList = jarFolder.entries(); + + while (jarEntityList.hasMoreElements()) { + JarEntry jarEntity = (JarEntry) jarEntityList.nextElement(); + if (jarEntity.getName().endsWith(".class")) { + loadedClasses.add(classLoader.loadClass(jarEntity.getName().replace('/', '.').substring(0, jarEntity.getName().length() - 6))); } } - return classNames; - } - public ArrayList getClasses(){ - return classes; - } - public Class getClass(int number){ - return classes.get(number); - } - public void delClasses(){ - classes=new ArrayList(); - } - public int classCount(){ - return classes.size(); + return loadedClasses; } + }