diff --git a/src/me/libraryaddict/disguise/utilities/ClassGetter.java b/src/me/libraryaddict/disguise/utilities/ClassGetter.java new file mode 100644 index 00000000..966166fe --- /dev/null +++ b/src/me/libraryaddict/disguise/utilities/ClassGetter.java @@ -0,0 +1,72 @@ +package me.libraryaddict.disguise.utilities; + +import org.bukkit.entity.Entity; + +import java.io.IOException; +import java.net.URL; +import java.security.CodeSource; +import java.util.ArrayList; +import java.util.Enumeration; +import java.util.jar.JarEntry; +import java.util.jar.JarFile; + +/** + * User: Austin Date: 4/22/13 Time: 11:47 PM (c) lazertester + */ + +// Code for this taken and slightly modified from +// https://github.com/ddopson/java-class-enumerator +public class ClassGetter { + + public static ArrayList> getClassesForPackage(String pkgname) { + ArrayList> classes = new ArrayList>(); + // String relPath = pkgname.replace('.', '/'); + + // Get a File object for the package + CodeSource src = Entity.class.getProtectionDomain().getCodeSource(); + if (src != null) { + URL resource = src.getLocation(); + resource.getPath(); + processJarfile(resource, pkgname, classes); + } + return classes; + } + + private static Class loadClass(String className) { + try { + return Class.forName(className); + } catch (ClassNotFoundException e) { + throw new RuntimeException("Unexpected ClassNotFoundException loading class '" + className + "'"); + } catch (NoClassDefFoundError e) { + return null; + } + } + + private static void processJarfile(URL resource, String pkgname, ArrayList> classes) { + String relPath = pkgname.replace('.', '/'); + String resPath = resource.getPath().replace("%20", " "); + String jarPath = resPath.replaceFirst("[.]jar[!].*", ".jar").replaceFirst("file:", ""); + JarFile jarFile; + try { + jarFile = new JarFile(jarPath); + } catch (IOException e) { + throw new RuntimeException("Unexpected IOException reading JAR File '" + jarPath + + "'. Do you have strange characters in your folders? Such as #?", e); + } + Enumeration entries = jarFile.entries(); + while (entries.hasMoreElements()) { + JarEntry entry = entries.nextElement(); + String entryName = entry.getName(); + String className = null; + if (entryName.endsWith(".class") && entryName.startsWith(relPath) + && entryName.length() > (relPath.length() + "/".length())) { + className = entryName.replace('/', '.').replace('\\', '.').replace(".class", ""); + } + if (className != null) { + Class c = loadClass(className); + if (c != null) + classes.add(c); + } + } + } +}