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 9147ce7f5b72
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;
+	}
+}