Add class enumerator for future class stuff
This commit is contained in:
parent
62bc5c267a
commit
97bf92375a
1 changed files with 115 additions and 0 deletions
115
common/mekanism/common/classloading/ClassEnumerator.java
Normal file
115
common/mekanism/common/classloading/ClassEnumerator.java
Normal file
|
@ -0,0 +1,115 @@
|
||||||
|
package mekanism.common.classloading;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.net.URL;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Enumeration;
|
||||||
|
import java.util.jar.JarEntry;
|
||||||
|
import java.util.jar.JarFile;
|
||||||
|
|
||||||
|
public class ClassEnumerator
|
||||||
|
{
|
||||||
|
private static Class<?> loadClass(String className)
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
return Class.forName(className);
|
||||||
|
} catch(ClassNotFoundException e) {
|
||||||
|
throw new RuntimeException("Unexpected ClassNotFoundException loading class '" + className + "'");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void processDir(File directory, String pkgname, ArrayList<Class<?>> classes)
|
||||||
|
{
|
||||||
|
String[] files = directory.list();
|
||||||
|
|
||||||
|
for(int i = 0; i < files.length; i++)
|
||||||
|
{
|
||||||
|
String fileName = files[i];
|
||||||
|
String className = null;
|
||||||
|
|
||||||
|
if(fileName.endsWith(".class"))
|
||||||
|
{
|
||||||
|
className = pkgname + '.' + fileName.substring(0, fileName.length() - 6);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(className != null)
|
||||||
|
{
|
||||||
|
classes.add(loadClass(className));
|
||||||
|
}
|
||||||
|
|
||||||
|
File subdir = new File(directory, fileName);
|
||||||
|
|
||||||
|
if(subdir.isDirectory())
|
||||||
|
{
|
||||||
|
processDir(subdir, pkgname + '.' + fileName, classes);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void processJar(URL resource, String pkgname, ArrayList<Class<?>> classes)
|
||||||
|
{
|
||||||
|
String relPath = pkgname.replace('.', '/');
|
||||||
|
String resPath = resource.getPath();
|
||||||
|
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 + "'", e);
|
||||||
|
}
|
||||||
|
|
||||||
|
Enumeration<JarEntry> 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)
|
||||||
|
{
|
||||||
|
classes.add(loadClass(className));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ArrayList<Class<?>> getClassesForPackage(Package pkg)
|
||||||
|
{
|
||||||
|
ArrayList<Class<?>> classes = new ArrayList<Class<?>>();
|
||||||
|
|
||||||
|
try {
|
||||||
|
String pkgname = pkg.getName();
|
||||||
|
String relPath = pkgname.replace('.', '/');
|
||||||
|
|
||||||
|
URL resource = ClassLoader.getSystemClassLoader().getResource(relPath);
|
||||||
|
|
||||||
|
if(resource == null)
|
||||||
|
{
|
||||||
|
throw new RuntimeException("Unexpected problem: No resource for " + relPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
resource.getPath();
|
||||||
|
|
||||||
|
if(resource.toString().startsWith("jar:"))
|
||||||
|
{
|
||||||
|
processJar(resource, pkgname, classes);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
processDir(new File(resource.getPath()), pkgname, classes);
|
||||||
|
}
|
||||||
|
} catch(Exception e) {
|
||||||
|
System.err.println("[Mekanism] Error while loading classes in package " + pkg);
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
return classes;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue