package janala.interpreters;
import janala.utils.MyLogger;
import java.io.Serializable;
import java.util.Map;
import java.util.TreeMap;
import java.util.logging.Level;
import java.util.logging.Logger;
public class ClassDepot implements Serializable {
final private Map<String, ClassTemplate> templates;
public static ClassDepot instance = new ClassDepot();
public static void setInstance(ClassDepot i) {
instance = i;
}
public static ClassDepot getInstance() {
return instance;
}
private final static Logger logger = MyLogger.getLogger(ClassDepot.class.getName());
// VisibleForTesting
public ClassDepot() {
templates = new TreeMap<String, ClassTemplate>();
}
private ClassTemplate getOrCreateTemplate(String cName, Class<?> clazz) {
ClassTemplate ct = templates.get(cName);
if (ct != null) {
return ct;
}
ct = new ClassTemplate(clazz);
templates.put(cName, ct);
Class<?> parent = clazz.getSuperclass();
if (parent != null) {
ClassTemplate pt = getOrCreateTemplate(parent.getName(), parent);
ct.addFields(pt);
}
return ct;
}
public int getFieldIndex(String cName, String field) {
try {
Class<?> clazz = Class.forName(cName);
ClassTemplate ct = getOrCreateTemplate(cName, clazz);
return ct.getFieldIndex(field);
} catch (ClassNotFoundException e) {
logger.log(Level.SEVERE, "", e);
return -1;
}
}
public int getStaticFieldIndex(String cName, String field) {
try {
Class<?> clazz = Class.forName(cName);
ClassTemplate ct = getOrCreateTemplate(cName, clazz);
return ct.getStaticFieldIndex(field);
} catch (ClassNotFoundException e) {
logger.log(Level.SEVERE, "", e);
return -1;
}
}
public int nFields(String cName) {
try {
Class<?> clazz = Class.forName(cName);
ClassTemplate ct = getOrCreateTemplate(cName, clazz);
return ct.nFields();
} catch (ClassNotFoundException e) {
logger.log(Level.SEVERE, "Class not found", e);
return -1;
}
}
public int nStaticFields(String cName) {
try {
Class<?> clazz = Class.forName(cName);
ClassTemplate ct = getOrCreateTemplate(cName, clazz);
return ct.nStaticFields();
} catch (ClassNotFoundException e) {
logger.log(Level.SEVERE, "", e);
return -1;
}
}
}