package com.bladecoder.engineeditor.common;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Hashtable;
public class FolderClassLoader extends ClassLoader {
private String dirName = null; // Path to the .class folder
private Hashtable<String, Class<?>> classes = new Hashtable<String, Class<?>>(); // used
// to
// cache
// already
// defined classes
public FolderClassLoader(String dir) throws IOException {
super(FolderClassLoader.class.getClassLoader()); // calls the parent
// class
// loader's
// constructor
this.dirName = dir;
loadClassesInFolder(new File(dirName), null);
}
public void reload() throws IOException {
loadClassesInFolder(new File(dirName), null);
}
@Override
public Class<?> loadClass(String className) throws ClassNotFoundException {
return findClass(className);
}
@Override
public Class<?> findClass(String className) {
Class<?> result = null;
result = (Class<?>) classes.get(className); // checks in cached classes
if (result != null) {
return result;
}
try {
return findSystemClass(className);
} catch (Exception e) {
return null;
}
}
private void loadClassesInFolder(File folder, String classPackage) throws IOException {
byte classByte[];
File[] list = folder.listFiles();
if (list != null) {
for (File f : list) {
if (f.isDirectory()) {
String pkg = classPackage;
if (pkg != null) {
pkg += ".";
pkg += f.getName();
} else {
pkg = f.getName();
}
loadClassesInFolder(f, pkg);
} else if (f.getName().endsWith(".class")) {
InputStream is = null;
try {
is = new FileInputStream(f);
ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
int nextValue = is.read();
while (-1 != nextValue) {
byteStream.write(nextValue);
nextValue = is.read();
}
classByte = byteStream.toByteArray();
String className = classPackage + "." + f.getName().substring(0, f.getName().length() - 6);
EditorLogger.debug(">>>>>>>>>> LOADING CLASS: " + className);
if (classes.get(className) == null) {
Class<?> result = defineClass(className, classByte, 0, classByte.length, null);
classes.put(className, result);
}
} catch (IOException e) {
throw e;
} finally {
is.close();
}
}
}
}
}
public Hashtable<String, Class<?>> getClasses() {
return classes;
}
}