/* * Copyright (c) 1998, 2012, 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 4112682 * @summary RMIClassLoader's loadClass() method that takes explicit URLs * should load classes from a class loader that delegates to the current * thread's context class loader (not just the base class loader always). * @author Peter Jones * * @library ../../../testlibrary * @modules java.rmi/sun.rmi.registry * java.rmi/sun.rmi.server * java.rmi/sun.rmi.transport * java.rmi/sun.rmi.transport.tcp * @build TestLibrary Dummy * @run main/othervm/policy=security.policy/timeout=120 DelegateToContextLoader */ import java.io.*; import java.net.*; import java.security.*; import java.rmi.RMISecurityManager; import java.rmi.server.RMIClassLoader; public class DelegateToContextLoader { /** name of target class to attempt to load */ private static final String className = "Dummy"; /** name of file containing definition for target class */ private static final String classFileName = className + ".class"; public static void main(String[] args) throws Exception { /* * Set a security manager so that RMI class loading will not * be disabled. */ TestLibrary.suggestSecurityManager("java.rmi.RMISecurityManager"); URL codebaseURL = TestLibrary. installClassInCodebase(className, "codebase"); /* Create a URLClassLoader to load from the codebase and set it * as this thread's context class loader. We do not use the * URLClassLoader.newInstance() method so that the test will * compile with more early versions of the JDK. * * We can get away with creating a class loader like this * because there is no security manager set yet. */ ClassLoader codebaseLoader = new URLClassLoader(new URL[] { codebaseURL } ); Thread.currentThread().setContextClassLoader(codebaseLoader); File srcDir = new File(TestLibrary.getProperty("test.classes", ".")); URL dummyURL = new URL("file", "", srcDir.getAbsolutePath().replace(File.separatorChar, '/') + "/x-files/"); try { /* * Attempt to load the target class from the dummy URL; * it should be found in the context class loader. */ Class cl = RMIClassLoader.loadClass(dummyURL, className); System.err.println("TEST PASSED: loaded class: " + cl); } catch (ClassNotFoundException e) { throw new RuntimeException( "TEST FAILED: target class in context class loader " + "not found using RMIClassLoader"); } } }