package me.august.lumen.compile.resolve.lookup; import me.august.lumen.compile.resolve.data.ClassData; import java.io.IOException; import java.util.HashMap; import java.util.Map; import java.util.jar.JarEntry; import java.util.jar.JarFile; public class JarLookup implements ClassLookup { private JarFile jar; private Map<String, ClassData> cache = new HashMap<>(); public JarLookup(JarFile jar) { this.jar = jar; } @Override public ClassData lookup(String path) { path = path.replace('.', '/'); // Jar entries end with .class if (!path.endsWith(".class")) path += ".class"; ClassData cached = cache.get(path); if (cached != null) return cached; JarEntry entry = jar.getJarEntry(path); try { ClassData classData = ClassData.fromClassFile(jar.getInputStream(entry)); cache.put(path, classData); return classData; } catch (IOException e) { return null; } } @Override public boolean hasClass(String path) { path = checkName(path); if (cache.containsKey(path)) return true; return jar.getEntry(path) != null; } private String checkName(String pathName) { if (!pathName.endsWith(".class")) pathName += ".class"; return pathName; } }