changeset 1860:bcb015265c21 default tip

better uniqueClassLoader
author Franklin Schmidt <fschmidt@gmail.com>
date Tue, 18 Mar 2025 17:44:35 -0600
parents d4f857a37961
children
files src/goodjava/io/FileClassLoader.java src/luan/Luan.java src/luan/modules/JavaLuan.java
diffstat 3 files changed, 20 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
diff -r d4f857a37961 -r bcb015265c21 src/goodjava/io/FileClassLoader.java
--- a/src/goodjava/io/FileClassLoader.java	Tue Mar 18 15:38:31 2025 -0600
+++ b/src/goodjava/io/FileClassLoader.java	Tue Mar 18 17:44:35 2025 -0600
@@ -24,14 +24,14 @@
 			this.checksum = IoUtils.checksum( new BufferedInputStream( new FileInputStream(file) ) );
 		}
 
-		public boolean equals(Object obj) {
+		@Override 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() {
+		@Override public int hashCode() {
 			return (int)checksum;
 		}
 	}
diff -r d4f857a37961 -r bcb015265c21 src/luan/Luan.java
--- a/src/luan/Luan.java	Tue Mar 18 15:38:31 2025 -0600
+++ b/src/luan/Luan.java	Tue Mar 18 17:44:35 2025 -0600
@@ -33,10 +33,15 @@
 	public final Map rootRegistry;  // synchronize access
 	private final Map localOnly = new HashMap();
 
+	private static String clName(boolean uniqueClassLoader) {
+		return uniqueClassLoader ? "Luan.classLoader_unique" : "Luan.classLoader_shared";
+	}
+
 	public Luan() {
 		this.registry = new HashMap();
 		this.rootRegistry = new HashMap();
-		rootRegistry.put("Luan.classLoader",emptyClassLoader);
+		rootRegistry.put(clName(false),emptyClassLoader);
+		rootRegistry.put(clName(true),emptyClassLoader);
 	}
 
 	public Luan(Luan luan) {
@@ -482,16 +487,23 @@
 
 	// jars
 
-	public ClassLoader getClassLoader() {
+	public Class loadClass(String name) throws ClassNotFoundException {
 		synchronized(rootRegistry) {
-			return (FileClassLoader)rootRegistry.get("Luan.classLoader");
+			FileClassLoader classLoader = (FileClassLoader)rootRegistry.get(clName(false));
+			try {
+				return classLoader.loadClass(name);
+			} catch(ClassNotFoundException e) {
+				classLoader = (FileClassLoader)rootRegistry.get(clName(true));
+				return classLoader.loadClass(name);
+			}
 		}
 	}
 
 	public void addJar(File jar,boolean uniqueClassLoader) throws IOException {
 		FileClassLoader.FileInfo file = new FileClassLoader.FileInfo(jar);
 		synchronized(rootRegistry) {
-			FileClassLoader classLoader = (FileClassLoader)rootRegistry.get("Luan.classLoader");
+			String clName = clName(uniqueClassLoader);
+			FileClassLoader classLoader = (FileClassLoader)rootRegistry.get(clName);
 			List<FileClassLoader.FileInfo> files = classLoader.getFiles();
 			if( files.contains(file) )
 				return;
@@ -501,7 +513,7 @@
 			} else {
 				classLoader = FileClassLoader.getFileClassLoader(files);
 			}
-			rootRegistry.put("Luan.classLoader",classLoader);
+			rootRegistry.put(clName,classLoader);
 		}
 	}
 
diff -r d4f857a37961 -r bcb015265c21 src/luan/modules/JavaLuan.java
--- a/src/luan/modules/JavaLuan.java	Tue Mar 18 15:38:31 2025 -0600
+++ b/src/luan/modules/JavaLuan.java	Tue Mar 18 17:44:35 2025 -0600
@@ -348,7 +348,7 @@
 				cls = Thread.currentThread().getContextClassLoader().loadClass(name);
 			} catch(ClassNotFoundException e2) {
 				try {
-					cls = luan.getClassLoader().loadClass(name);
+					cls = luan.loadClass(name);
 				} catch(ClassNotFoundException e3) {
 					return null;
 				}