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 { private static final long serialVersionUID = 1; private final Map<String, ClassTemplate> templates; public static ClassDepot instance = new ClassDepot(); public static void setInstance(ClassDepot newInstance) { instance = newInstance; } public static ClassDepot getInstance() { return instance; } private static final Logger logger = MyLogger.getLogger(ClassDepot.class.getName()); // VisibleForTesting public ClassDepot() { templates = new TreeMap<String, ClassTemplate>(); } private ClassTemplate getOrCreateTemplate(String className, Class<?> clazz) { ClassTemplate ct = templates.get(className); if (ct != null) { return ct; } ct = new ClassTemplate(clazz); templates.put(className, ct); Class<?> parent = clazz.getSuperclass(); if (parent != null) { ClassTemplate pt = getOrCreateTemplate(parent.getName(), parent); ct.addFields(pt); } return ct; } public int getFieldIndex(String className, String field) { try { Class<?> clazz = Class.forName(className); ClassTemplate ct = getOrCreateTemplate(className, clazz); return ct.getFieldIndex(field); } catch (ClassNotFoundException e) { logger.log(Level.SEVERE, "", e); return -1; } } public int getStaticFieldIndex(String className, String field) { try { Class<?> clazz = Class.forName(className); ClassTemplate ct = getOrCreateTemplate(className, clazz); return ct.getStaticFieldIndex(field); } catch (ClassNotFoundException e) { logger.log(Level.SEVERE, "", e); return -1; } } public int numFields(String className) { try { Class<?> clazz = Class.forName(className); ClassTemplate ct = getOrCreateTemplate(className, clazz); return ct.nFields(); } catch (ClassNotFoundException e) { logger.log(Level.SEVERE, "Class not found", e); return -1; } } public int numStaticFields(String className) { try { Class<?> clazz = Class.forName(className); ClassTemplate ct = getOrCreateTemplate(className, clazz); return ct.nStaticFields(); } catch (ClassNotFoundException e) { logger.log(Level.SEVERE, "", e); return -1; } } }