8034853: remove sun.misc.ClassLoaderUtil
authormichaelm
Tue, 18 Feb 2014 12:25:31 +0000
changeset 22982 9b9414a0aa64
parent 22981 e3195924b412
child 22983 dcf263874c96
8034853: remove sun.misc.ClassLoaderUtil Reviewed-by: alanb, mchung, chegar
jdk/src/share/classes/sun/misc/ClassLoaderUtil.java
jdk/test/sun/misc/ClassLoaderUtil/Test.java
--- a/jdk/src/share/classes/sun/misc/ClassLoaderUtil.java	Tue Feb 18 11:23:00 2014 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,172 +0,0 @@
-/*
- * Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.  Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package sun.misc;
-
-/**
- * Provides utility functions related to URLClassLoaders or subclasses of it.
- *
- *                  W  A  R  N  I  N  G
- *
- * This class uses undocumented, unpublished, private data structures inside
- * java.net.URLClassLoader and sun.misc.URLClassPath.  Use with extreme caution.
- *
- * @author      tjquinn
- */
-
-
-import java.io.IOException;
-import java.net.URLClassLoader;
-import java.util.*;
-import java.util.jar.JarFile;
-
-public class ClassLoaderUtil {
-
-    /**
-     * Releases resources held by a URLClassLoader. A new classloader must
-     * be created before the underlying resources can be accessed again.
-     * @param classLoader the instance of URLClassLoader (or a subclass)
-     */
-    public static void releaseLoader(URLClassLoader classLoader) {
-        releaseLoader(classLoader, null);
-    }
-
-    /**
-     * Releases resources held by a URLClassLoader.  Notably, close the jars
-     * opened by the loader. Initializes and updates the List of
-     * jars that have been successfully closed.
-     * <p>
-     * @param classLoader the instance of URLClassLoader (or a subclass)
-     * @param jarsClosed a List of Strings that will contain the names of jars
-     *  successfully closed; can be null if the caller does not need the information returned
-     * @return a List of IOExceptions reporting jars that failed to close; null
-     * indicates that an error other than an IOException occurred attempting to
-     * release the loader; empty indicates a successful release; non-empty
-     * indicates at least one error attempting to close an open jar.
-     */
-    public static List<IOException> releaseLoader(URLClassLoader classLoader, List<String> jarsClosed) {
-
-        List<IOException> ioExceptions = new LinkedList<IOException>();
-
-        try {
-            /* Records all IOExceptions thrown while closing jar files. */
-
-            if (jarsClosed != null) {
-                jarsClosed.clear();
-            }
-
-            URLClassPath ucp = SharedSecrets.getJavaNetAccess()
-                                                .getURLClassPath(classLoader);
-            ArrayList<?> loaders = ucp.loaders;
-            Stack<?> urls = ucp.urls;
-            HashMap<?,?> lmap = ucp.lmap;
-
-            /*
-             *The urls variable in the URLClassPath object holds URLs that have not yet
-             *been used to resolve a resource or load a class and, therefore, do
-             *not yet have a loader associated with them.  Clear the stack so any
-             *future requests that might incorrectly reach the loader cannot be
-             *resolved and cannot open a jar file after we think we've closed
-             *them all.
-             */
-            synchronized(urls) {
-                urls.clear();
-            }
-
-            /*
-             *Also clear the map of URLs to loaders so the class loader cannot use
-             *previously-opened jar files - they are about to be closed.
-             */
-            synchronized(lmap) {
-                lmap.clear();
-            }
-
-            /*
-             *The URLClassPath object's path variable records the list of all URLs that are on
-             *the URLClassPath's class path.  Leave that unchanged.  This might
-             *help someone trying to debug why a released class loader is still used.
-             *Because the stack and lmap are now clear, code that incorrectly uses a
-             *the released class loader will trigger an exception if the
-             *class or resource would have been resolved by the class
-             *loader (and no other) if it had not been released.
-             *
-             *The list of URLs might provide some hints to the person as to where
-             *in the code the class loader was set up, which might in turn suggest
-             *where in the code the class loader needs to stop being used.
-             *The URLClassPath does not use the path variable to open new jar
-             *files - it uses the urls Stack for that - so leaving the path variable
-             *will not by itself allow the class loader to continue handling requests.
-             */
-
-            /*
-             *For each loader, close the jar file associated with that loader.
-             *
-             *The URLClassPath's use of loaders is sync-ed on the entire URLClassPath
-             *object.
-             */
-            synchronized (ucp) {
-                for (Object o : loaders) {
-                    if (o != null) {
-                        /*
-                         *If the loader is a JarLoader inner class and its jarFile
-                         *field is non-null then try to close that jar file.  Add
-                         *it to the list of closed files if successful.
-                         */
-                        if (o instanceof URLClassPath.JarLoader) {
-                                URLClassPath.JarLoader jl = (URLClassPath.JarLoader)o;
-                                JarFile jarFile = jl.getJarFile();
-                                try {
-                                    if (jarFile != null) {
-                                        jarFile.close();
-                                        if (jarsClosed != null) {
-                                            jarsClosed.add(jarFile.getName());
-                                        }
-                                    }
-                                } catch (IOException ioe) {
-                                    /*
-                                     *Wrap the IOException to identify which jar
-                                     *could not be closed and add it to the list
-                                     *of IOExceptions to be returned to the caller.
-                                     */
-                                    String jarFileName = (jarFile == null) ? "filename not available":jarFile.getName();
-                                    String msg = "Error closing JAR file: " + jarFileName;
-                                    IOException newIOE = new IOException(msg);
-                                    newIOE.initCause(ioe);
-                                    ioExceptions.add(newIOE);
-                                }
-                        }
-                    }
-                }
-                /*
-                 *Now clear the loaders ArrayList.
-                 */
-                loaders.clear();
-            }
-        } catch (Throwable t) {
-            throw new RuntimeException (t);
-        }
-        return ioExceptions;
-    }
-}
--- a/jdk/test/sun/misc/ClassLoaderUtil/Test.java	Tue Feb 18 11:23:00 2014 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,70 +0,0 @@
-/*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-/* @test
- * @bug 6349735
- * @summary  Internal API for closing jar files belonging to URLClassLoader instances
- */
-
-import java.io.*;
-import java.net.*;
-import java.util.*;
-
-public class Test {
-
-    static File copy (File src, String destDir) throws Exception {
-        FileInputStream fis = new FileInputStream (src);
-        File dest = new File (destDir, src.getName());
-        FileOutputStream fos = new FileOutputStream (dest);
-        byte buf[] = new byte [1024];
-        int c;
-        while ((c=fis.read(buf)) != -1) {
-            fos.write (buf, 0, c);
-        }
-        fis.close();
-        fos.close();
-        return dest;
-    }
-
-    public static void main(String[] args) throws Exception {
-        String srcPath = System.getProperty("test.src");
-        String destPath = System.getProperty("test.classes");
-        if (destPath == null || "".equals(destPath)) {
-            throw new RuntimeException ("Not running test");
-        }
-        File file = new File (srcPath, "test.jar");
-        file = copy (file, destPath);
-        URL url = file.toURL();
-        URLClassLoader loader = new URLClassLoader (new URL [] {url});
-        Class clazz = Class.forName ("Foo", true,  loader);
-        Object obj = clazz.newInstance();
-        List<String> jarsclosed = new LinkedList<String>();
-        sun.misc.ClassLoaderUtil.releaseLoader (loader, jarsclosed);
-        for (String jar: jarsclosed) {
-            System.out.println ("Successfully closed " + jar);
-        }
-        if (!file.delete()) {
-            throw new RuntimeException ("failed to delete jar file");
-        }
-    }
-}