protected AnnotationFinder newFinder() { return new AnnotationFinder(new CompositeArchive(Stream .of(classes) .map(c -> new FileArchive(Thread.currentThread().getContextClassLoader(), c)) .toArray(Archive[]::new))) { private final Map<Class<?>, List<Field>> fieldCache = new HashMap<>(); private final Map<Class<?>, List<Class<?>>> classCache = new HashMap<>(); @Override public List<Field> findAnnotatedFields(final Class<? extends Annotation> annotation) { return fieldCache.computeIfAbsent(annotation, a -> super.findAnnotatedFields(annotation)); } @Override public List<Class<?>> findAnnotatedClasses(final Class<? extends Annotation> annotation) { return classCache.computeIfAbsent(annotation, a -> super.findAnnotatedClasses(annotation)); } }; }
private static File toFile(final String classFileName, final URL url) { String path = url.getFile(); path = path.substring(0, path.length() - classFileName.length()); return new File(decode(path)); }
public Iterator<Entry> iterator() { return new ArchiveIterator(this, _iterator()); }
private List<String> file(File dir) { List<String> classNames = new ArrayList<String>(); if (dir.isDirectory()) { scanDir(dir, classNames, (basePackage.length() > 0) ? (basePackage + ".") : basePackage); } return classNames; }
public FileArchive(ClassLoader loader, URL url, String basePackage) { this.loader = loader; this.basePackage = basePackage; this.dir = toFile(url); }
public Iterator<String> _iterator() { if (list != null) return list.iterator(); list = file(dir); return list.iterator(); }
private List<String> file(File dir) { List<String> classNames = new ArrayList<String>(); if (dir.isDirectory()) { scanDir(dir, classNames, ""); } return classNames; }
public FileArchive(ClassLoader loader, URL url) { this.loader = loader; this.basePackage = ""; this.dir = toFile(url); }
public Iterator<String> _iterator() { if (list != null) return list.iterator(); final File manifest = new File(dir, "META-INF/MANIFEST.MF"); if (manifest.exists()) { InputStream is = null; try { is = new FileInputStream(manifest); mjar.load(is); } catch (final IOException e) { // no-op } finally { if (is != null) { try { is.close(); } catch (final IOException e) { // no-op } } } } list = file(dir); return list.iterator(); }
private static void doGenerateSettings(final File file, final PrintWriter writer) { writer.println("== Settings"); writer.println(); new AnnotationFinder(new FileArchive(Thread.currentThread().getContextClassLoader(), file)) .findAnnotatedClasses(DynamicSettings.class).stream() .sorted(Comparator.comparing(Class::getName)) .forEach(s -> buildTree(true, s).childrenValues().forEach(n -> n.write("=== ", writer))); }
private static File toFile(URL url) { if (!"file".equals(url.getProtocol())) throw new IllegalArgumentException("not a file url: " + url); String path = url.getFile(); File dir = new File(decode(path)); if (dir.getName().equals("META-INF")) { dir = dir.getParentFile(); // Scrape "META-INF" off } return dir; }
private List<String> file(File dir) { List<String> classNames = new ArrayList<String>(); if (dir.isDirectory()) { scanDir(dir, classNames, (basePackage.length() > 0) ? (basePackage + ".") : basePackage); } return classNames; }
public FileArchive(ClassLoader loader, URL url, String basePackage) { this.loader = loader; this.basePackage = basePackage; this.dir = toFile(url); }
public Iterator<String> _iterator() { if (list != null) return list.iterator(); final File manifest = new File(dir, "META-INF/MANIFEST.MF"); if (manifest.exists()) { InputStream is = null; try { is = new FileInputStream(manifest); mjar.load(is); } catch (final IOException e) { // no-op } finally { if (is != null) { try { is.close(); } catch (final IOException e) { // no-op } } } } list = file(dir); return list.iterator(); }
public Iterator<Entry> iterator() { return new ArchiveIterator(this, _iterator()); }
public static Archive archive(ClassLoader loader, URL location) { if (location.getProtocol().equals("jar")) { return new JarArchive(loader, location); } else if (location.getProtocol().equals("file")) { try { // See if it's actually a jar URL jarUrl = new URL("jar", "", location.toExternalForm() + "!/"); JarURLConnection juc = (JarURLConnection) jarUrl.openConnection(); juc.getJarFile(); return new JarArchive(loader, jarUrl); } catch (IOException e) { return new FileArchive(loader, location); } } throw new UnsupportedOperationException("unsupported archive type: " + location); }
private static File toFile(URL url) { if (!"file".equals(url.getProtocol())) throw new IllegalArgumentException("not a file url: " + url); String path = url.getFile(); File dir = new File(decode(path)); if (dir.getName().equals("META-INF")) { dir = dir.getParentFile(); // Scrape "META-INF" off } return dir; }
private void scanDir(File dir, List<String> classNames, String packageName) { File[] files = dir.listFiles(); for (File file : files) { if (file.isDirectory()) { scanDir(file, classNames, packageName + file.getName() + "."); } else if (file.getName().endsWith(".class")) { String name = file.getName(); name = name.replaceFirst(".class$", ""); if (name.contains(".")) continue; classNames.add(packageName + name); } } }
public FileArchive(ClassLoader loader, URL url) { this.loader = loader; this.basePackage = ""; this.dir = toFile(url); }
public Iterator<Entry> iterator() { return new ArchiveIterator(this, _iterator()); }