1.1 --- a/src/share/classes/com/sun/tools/javac/file/CloseableURLClassLoader.java Thu Dec 10 20:35:31 2009 -0800 1.2 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 1.3 @@ -1,107 +0,0 @@ 1.4 -/* 1.5 - * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. 1.6 - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 1.7 - * 1.8 - * This code is free software; you can redistribute it and/or modify it 1.9 - * under the terms of the GNU General Public License version 2 only, as 1.10 - * published by the Free Software Foundation. Sun designates this 1.11 - * particular file as subject to the "Classpath" exception as provided 1.12 - * by Sun in the LICENSE file that accompanied this code. 1.13 - * 1.14 - * This code is distributed in the hope that it will be useful, but WITHOUT 1.15 - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 1.16 - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 1.17 - * version 2 for more details (a copy is included in the LICENSE file that 1.18 - * accompanied this code). 1.19 - * 1.20 - * You should have received a copy of the GNU General Public License version 1.21 - * 2 along with this work; if not, write to the Free Software Foundation, 1.22 - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 1.23 - * 1.24 - * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, 1.25 - * CA 95054 USA or visit www.sun.com if you need additional information or 1.26 - * have any questions. 1.27 - */ 1.28 - 1.29 -package com.sun.tools.javac.file; 1.30 - 1.31 -import java.io.Closeable; 1.32 -import java.io.IOException; 1.33 -import java.lang.reflect.Field; 1.34 -import java.net.URL; 1.35 -import java.net.URLClassLoader; 1.36 -import java.util.ArrayList; 1.37 -import java.util.jar.JarFile; 1.38 - 1.39 -/** 1.40 - * A URLClassLoader that also implements Closeable. 1.41 - * Reflection is used to access internal data structures in the URLClassLoader, 1.42 - * since no public API exists for this purpose. Therefore this code is somewhat 1.43 - * fragile. Caveat emptor. 1.44 - * @throws Error if the internal data structures are not as expected. 1.45 - * 1.46 - * <p><b>This is NOT part of any API supported by Sun Microsystems. If 1.47 - * you write code that depends on this, you do so at your own risk. 1.48 - * This code and its internal interfaces are subject to change or 1.49 - * deletion without notice.</b> 1.50 - */ 1.51 -class CloseableURLClassLoader 1.52 - extends URLClassLoader implements Closeable { 1.53 - CloseableURLClassLoader(URL[] urls, ClassLoader parent) throws Error { 1.54 - super(urls, parent); 1.55 - try { 1.56 - getLoaders(); //proactive check that URLClassLoader is as expected 1.57 - } catch (Throwable t) { 1.58 - throw new Error("cannot create CloseableURLClassLoader", t); 1.59 - } 1.60 - } 1.61 - 1.62 - /** 1.63 - * Close any jar files that may have been opened by the class loader. 1.64 - * Reflection is used to access the jar files in the URLClassLoader's 1.65 - * internal data structures. 1.66 - * @throws java.io.IOException if the jar files cannot be found for any 1.67 - * reson, or if closing the jar file itself causes an IOException. 1.68 - */ 1.69 - public void close() throws IOException { 1.70 - try { 1.71 - for (Object l: getLoaders()) { 1.72 - if (l.getClass().getName().equals("sun.misc.URLClassPath$JarLoader")) { 1.73 - Field jarField = l.getClass().getDeclaredField("jar"); 1.74 - JarFile jar = (JarFile) getField(l, jarField); 1.75 - if (jar != null) { 1.76 - //System.err.println("CloseableURLClassLoader: closing " + jar); 1.77 - jar.close(); 1.78 - } 1.79 - } 1.80 - } 1.81 - } catch (Throwable t) { 1.82 - IOException e = new IOException("cannot close class loader"); 1.83 - e.initCause(t); 1.84 - throw e; 1.85 - } 1.86 - } 1.87 - 1.88 - private ArrayList<?> getLoaders() 1.89 - throws NoSuchFieldException, IllegalArgumentException, IllegalAccessException 1.90 - { 1.91 - Field ucpField = URLClassLoader.class.getDeclaredField("ucp"); 1.92 - Object urlClassPath = getField(this, ucpField); 1.93 - if (urlClassPath == null) 1.94 - throw new AssertionError("urlClassPath not set in URLClassLoader"); 1.95 - Field loadersField = urlClassPath.getClass().getDeclaredField("loaders"); 1.96 - return (ArrayList<?>) getField(urlClassPath, loadersField); 1.97 - } 1.98 - 1.99 - private Object getField(Object o, Field f) 1.100 - throws IllegalArgumentException, IllegalAccessException { 1.101 - boolean prev = f.isAccessible(); 1.102 - try { 1.103 - f.setAccessible(true); 1.104 - return f.get(o); 1.105 - } finally { 1.106 - f.setAccessible(prev); 1.107 - } 1.108 - } 1.109 - 1.110 -}