annotate src/goodjava/io/FileClassLoader.java @ 1844:9147ce7f5b72 default tip

FileClassLoader use SoftCacheMap
author Franklin Schmidt <fschmidt@gmail.com>
date Sun, 02 Feb 2025 04:55:02 -0700
parents 22f73129eb4a
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1842
22f73129eb4a add load_jar
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1 package goodjava.io;
22f73129eb4a add load_jar
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
2
22f73129eb4a add load_jar
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
3 import java.io.File;
22f73129eb4a add load_jar
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
4 import java.io.FileInputStream;
22f73129eb4a add load_jar
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
5 import java.io.BufferedInputStream;
22f73129eb4a add load_jar
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
6 import java.io.IOException;
22f73129eb4a add load_jar
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
7 import java.net.URL;
22f73129eb4a add load_jar
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
8 import java.net.URLClassLoader;
22f73129eb4a add load_jar
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
9 import java.net.MalformedURLException;
22f73129eb4a add load_jar
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
10 import java.util.List;
22f73129eb4a add load_jar
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
11 import java.util.ArrayList;
22f73129eb4a add load_jar
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
12 import java.util.Map;
1844
9147ce7f5b72 FileClassLoader use SoftCacheMap
Franklin Schmidt <fschmidt@gmail.com>
parents: 1842
diff changeset
13 import goodjava.util.SoftCacheMap;
1842
22f73129eb4a add load_jar
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
14
22f73129eb4a add load_jar
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
15
22f73129eb4a add load_jar
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
16 public class FileClassLoader extends URLClassLoader {
22f73129eb4a add load_jar
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
17
22f73129eb4a add load_jar
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
18 public static final class FileInfo {
22f73129eb4a add load_jar
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
19 public final File file;
22f73129eb4a add load_jar
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
20 private final long checksum;
22f73129eb4a add load_jar
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
21
22f73129eb4a add load_jar
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
22 public FileInfo(File file) throws IOException {
22f73129eb4a add load_jar
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
23 this.file = file;
22f73129eb4a add load_jar
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
24 this.checksum = IoUtils.checksum( new BufferedInputStream( new FileInputStream(file) ) );
22f73129eb4a add load_jar
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
25 }
22f73129eb4a add load_jar
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
26
22f73129eb4a add load_jar
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
27 public boolean equals(Object obj) {
22f73129eb4a add load_jar
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
28 if( !(obj instanceof FileInfo) )
22f73129eb4a add load_jar
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
29 return false;
22f73129eb4a add load_jar
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
30 FileInfo fi = (FileInfo)obj;
22f73129eb4a add load_jar
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
31 return this.checksum==fi.checksum && this.file.getName().equals(fi.file.getName());
22f73129eb4a add load_jar
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
32 }
22f73129eb4a add load_jar
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
33
22f73129eb4a add load_jar
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
34 public int hashCode() {
22f73129eb4a add load_jar
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
35 return (int)checksum;
22f73129eb4a add load_jar
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
36 }
22f73129eb4a add load_jar
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
37 }
22f73129eb4a add load_jar
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
38
22f73129eb4a add load_jar
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
39 private static URL[] toURLs(List<FileInfo> files) {
22f73129eb4a add load_jar
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
40 int n = files.size();
22f73129eb4a add load_jar
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
41 URL[] urls = new URL[n];
22f73129eb4a add load_jar
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
42 for( int i=0; i<n; i++ ) {
22f73129eb4a add load_jar
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
43 try {
22f73129eb4a add load_jar
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
44 urls[i] = files.get(i).file.toURI().toURL();
22f73129eb4a add load_jar
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
45 } catch(MalformedURLException e) {
22f73129eb4a add load_jar
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
46 throw new RuntimeException(e);
22f73129eb4a add load_jar
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
47 }
22f73129eb4a add load_jar
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
48 }
22f73129eb4a add load_jar
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
49 return urls;
22f73129eb4a add load_jar
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
50 }
22f73129eb4a add load_jar
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
51
22f73129eb4a add load_jar
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
52 private final List<FileInfo> files;
22f73129eb4a add load_jar
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
53
22f73129eb4a add load_jar
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
54 private FileClassLoader(List<FileInfo> files) {
22f73129eb4a add load_jar
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
55 super(toURLs(files));
22f73129eb4a add load_jar
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
56 this.files = new ArrayList<FileInfo>(files);
22f73129eb4a add load_jar
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
57 }
22f73129eb4a add load_jar
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
58
22f73129eb4a add load_jar
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
59 public List<FileInfo> getFiles() {
22f73129eb4a add load_jar
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
60 return new ArrayList<FileInfo>(files);
22f73129eb4a add load_jar
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
61 }
22f73129eb4a add load_jar
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
62
1844
9147ce7f5b72 FileClassLoader use SoftCacheMap
Franklin Schmidt <fschmidt@gmail.com>
parents: 1842
diff changeset
63 private static final Map<List<FileInfo>,FileClassLoader> map = new SoftCacheMap<List<FileInfo>,FileClassLoader>();
1842
22f73129eb4a add load_jar
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
64
22f73129eb4a add load_jar
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
65 public static synchronized FileClassLoader getFileClassLoader(List<FileInfo> files) {
22f73129eb4a add load_jar
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
66 FileClassLoader fcl = map.get(files);
22f73129eb4a add load_jar
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
67 if( fcl == null ) {
22f73129eb4a add load_jar
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
68 fcl = new FileClassLoader(files);
22f73129eb4a add load_jar
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
69 map.put(fcl.files,fcl);
22f73129eb4a add load_jar
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
70 }
22f73129eb4a add load_jar
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
71 return fcl;
22f73129eb4a add load_jar
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
72 }
22f73129eb4a add load_jar
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
73 }