Mercurial Hosting > luan
diff src/goodjava/io/FileClassLoader.java @ 1842:22f73129eb4a
add load_jar
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Sat, 01 Feb 2025 16:54:41 -0700 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/goodjava/io/FileClassLoader.java Sat Feb 01 16:54:41 2025 -0700 @@ -0,0 +1,73 @@ +package goodjava.io; + +import java.io.File; +import java.io.FileInputStream; +import java.io.BufferedInputStream; +import java.io.IOException; +import java.net.URL; +import java.net.URLClassLoader; +import java.net.MalformedURLException; +import java.util.List; +import java.util.ArrayList; +import java.util.Map; +import java.util.HashMap; + + +public class FileClassLoader extends URLClassLoader { + + public static final class FileInfo { + public final File file; + private final long checksum; + + public FileInfo(File file) throws IOException { + this.file = file; + this.checksum = IoUtils.checksum( new BufferedInputStream( new FileInputStream(file) ) ); + } + + public boolean equals(Object obj) { + if( !(obj instanceof FileInfo) ) + return false; + FileInfo fi = (FileInfo)obj; + return this.checksum==fi.checksum && this.file.getName().equals(fi.file.getName()); + } + + public int hashCode() { + return (int)checksum; + } + } + + private static URL[] toURLs(List<FileInfo> files) { + int n = files.size(); + URL[] urls = new URL[n]; + for( int i=0; i<n; i++ ) { + try { + urls[i] = files.get(i).file.toURI().toURL(); + } catch(MalformedURLException e) { + throw new RuntimeException(e); + } + } + return urls; + } + + private final List<FileInfo> files; + + private FileClassLoader(List<FileInfo> files) { + super(toURLs(files)); + this.files = new ArrayList<FileInfo>(files); + } + + public List<FileInfo> getFiles() { + return new ArrayList<FileInfo>(files); + } + + private static final Map<List<FileInfo>,FileClassLoader> map = new HashMap<List<FileInfo>,FileClassLoader>(); + + public static synchronized FileClassLoader getFileClassLoader(List<FileInfo> files) { + FileClassLoader fcl = map.get(files); + if( fcl == null ) { + fcl = new FileClassLoader(files); + map.put(fcl.files,fcl); + } + return fcl; + } +}