src/windows/classes/sun/net/www/protocol/jar/JarFileFactory.java

Print this page

        

*** 41,57 **** * @since JDK1.2 */ class JarFileFactory implements URLJarFile.URLJarFileCloseController { /* the url to file cache */ ! private static HashMap<String, JarFile> fileCache = new HashMap<String, JarFile>(); /* the file to url cache */ ! private static HashMap<JarFile, URL> urlCache = new HashMap<JarFile, URL>(); URLConnection getConnection(JarFile jarFile) throws IOException { ! URL u = urlCache.get(jarFile); if (u != null) return u.openConnection(); return null; } --- 41,68 ---- * @since JDK1.2 */ class JarFileFactory implements URLJarFile.URLJarFileCloseController { /* the url to file cache */ ! private static final HashMap<String, JarFile> fileCache = new HashMap<>(); /* the file to url cache */ ! private static final HashMap<JarFile, URL> urlCache = new HashMap<>(); + private static final JarFileFactory instance = new JarFileFactory(); + + private JarFileFactory() { } + + public static JarFileFactory getInstance() { + return instance; + } + URLConnection getConnection(JarFile jarFile) throws IOException { ! URL u; ! synchronized (instance) { ! u = urlCache.get(jarFile); ! } if (u != null) return u.openConnection(); return null; }
*** 70,89 **** url = new URL("file", "", "//" + host + url.getPath()); } } ! JarFile result = null; ! JarFile local_result = null; if (useCaches) { ! synchronized (this) { result = getCachedJarFile(url); } if (result == null) { local_result = URLJarFile.getJarFile(url, this); ! synchronized (this) { result = getCachedJarFile(url); if (result == null) { fileCache.put(URLUtil.urlNoFragString(url), local_result); urlCache.put(local_result, url); result = local_result; --- 81,100 ---- url = new URL("file", "", "//" + host + url.getPath()); } } ! JarFile result; ! JarFile local_result; if (useCaches) { ! synchronized (instance) { result = getCachedJarFile(url); } if (result == null) { local_result = URLJarFile.getJarFile(url, this); ! synchronized (instance) { result = getCachedJarFile(url); if (result == null) { fileCache.put(URLUtil.urlNoFragString(url), local_result); urlCache.put(local_result, url); result = local_result;
*** 107,122 **** * Callback method of the URLJarFileCloseController to * indicate that the JarFile is close. This way we can * remove the JarFile from the cache */ public void close(JarFile jarFile) { URL urlRemoved = urlCache.remove(jarFile); ! if( urlRemoved != null) { fileCache.remove(URLUtil.urlNoFragString(urlRemoved)); } } private JarFile getCachedJarFile(URL url) { JarFile result = fileCache.get(URLUtil.urlNoFragString(url)); /* if the JAR file is cached, the permission will always be there */ if (result != null) { --- 118,135 ---- * Callback method of the URLJarFileCloseController to * indicate that the JarFile is close. This way we can * remove the JarFile from the cache */ public void close(JarFile jarFile) { + synchronized (instance) { URL urlRemoved = urlCache.remove(jarFile); ! if( urlRemoved != null) fileCache.remove(URLUtil.urlNoFragString(urlRemoved)); } } + // must be called while holding the 'instance' lock private JarFile getCachedJarFile(URL url) { JarFile result = fileCache.get(URLUtil.urlNoFragString(url)); /* if the JAR file is cached, the permission will always be there */ if (result != null) {