package com.coderising.jvm.loader;
import java.io.File;
import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
import com.coderising.jvm.clz.ClassFile;
public class ClassFileLoader {
private static final String CLASS_SUFFIX = ".class";
private static final byte[] EMPTY_BYTES = new byte[0];
private List<String> clzPaths = new ArrayList<String>();
public byte[] readBinaryCode(String className) {
if(StringUtils.isEmpty(className)) {
return EMPTY_BYTES;
}
String child = className.replace(".", File.separator) + CLASS_SUFFIX;
for (String parent: clzPaths) {
File file = new File(parent, child);
if(file.exists()) {
return doReadBinaryCode(file);
}
}
return EMPTY_BYTES;
}
private byte[] doReadBinaryCode(File file) {
FileInputStream fis = null;
try {
fis = new FileInputStream(file);
return IOUtils.toByteArray(fis);
} catch (Exception e) {
e.printStackTrace();
} finally {
IOUtils.closeQuietly(fis);
}
return EMPTY_BYTES;
}
public void addClassPath(String path) {
clzPaths.add(path);
}
public String getClassPath(){
return StringUtils.join(clzPaths, ";");
}
public ClassFile loadClass(String className) {
byte[] codes = this.readBinaryCode(className);
ClassFileParser parser = new ClassFileParser();
return parser.parse(codes);
}
}