--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/rmi/server/RMIClassLoader/useGetURLs/UseGetURLs.java Sat Dec 01 00:00:00 2007 +0000
@@ -0,0 +1,149 @@
+/*
+ * Copyright 1998-2002 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/* @test
+ * @bug 4137605
+ * @summary When the RMIClassLoader.getClassAnnotation() is called with a
+ * class loaded from any URLClassLoader instance (not just those created for
+ * internal use by the RMI runtime), then it should return a String containing
+ * a space-separated list of the class loader's path of URLs.
+ * @author Peter Jones
+ *
+ * @library ../../../testlibrary
+ * @build TestLibrary
+ * @build UseGetURLs Dummy
+ * @run main/othervm/policy=security.policy/timeout=120 UseGetURLs
+ */
+
+import java.io.*;
+import java.net.*;
+import java.util.*;
+import java.rmi.*;
+import java.rmi.server.*;
+
+public class UseGetURLs {
+
+ public static void main(String[] args) {
+
+ System.err.println("\nRegression test for bug 4137605\n");
+
+ TestLibrary.suggestSecurityManager("java.rmi.RMISecurityManager");
+ System.err.println("Security manager: " +
+ System.getSecurityManager().getClass().getName());
+
+ /*
+ * Install dummy class in first codebase to be loaded from an
+ * arbitrary URLClassLoader; the second codebase is used to make
+ * the desired annotation more interesting (more than one element).
+ */
+ URL codebase1 = null;
+ URL codebase2 = null;
+ try {
+ codebase1 = TestLibrary.installClassInCodebase("Dummy",
+ "codebase1");
+
+ File cb2file =
+ new File(TestLibrary.getProperty("user.dir", "."),
+ "codebase2");
+ codebase2 = cb2file.toURL();
+ } catch (MalformedURLException e) {
+ TestLibrary.bomb("failed to install test classes", e);
+ }
+
+ try {
+ /*
+ * Create an arbitary URLClassLoader for the two codebases.
+ */
+ ClassLoader loader = URLClassLoader.newInstance(
+ new URL[] { codebase1, codebase2 });
+ System.err.println(
+ "URLs for class loader: " +
+ Arrays.asList(((URLClassLoader) loader).getURLs()));
+ System.err.println("Expecting annotation: \"" +
+ codebase1 + " " + codebase2 + "\"");
+ System.err.println("First URL:");
+ dumpURL(codebase1);
+ System.err.println("Second URL:");
+ dumpURL(codebase2);
+
+ /*
+ * Load dummy class from the loader, get the annotation string,
+ * and verify that it is correct.
+ */
+ Class cl = loader.loadClass("Dummy");
+ String annotation = RMIClassLoader.getClassAnnotation(cl);
+ System.err.println("Received annotation: \"" +
+ annotation + "\"");
+
+ if (annotation == null) {
+ throw new RuntimeException("annotation was null");
+ }
+ URL[] urls = pathToURLs(annotation);
+ System.err.println(
+ "URLs from annotation: " + Arrays.asList(urls));
+ if (urls.length != 2) {
+ throw new RuntimeException(
+ "wrong number of elements in annotation");
+ }
+ if (!urls[0].equals(codebase1)) {
+ System.err.println("First URL in annotation is incorrect:");
+ dumpURL(urls[0]);
+ throw new RuntimeException(
+ "first URL in annotation is incorrect");
+ }
+ if (!urls[1].equals(codebase2)) {
+ System.err.println("Second URL in annotation is incorrect:");
+ dumpURL(urls[1]);
+ throw new RuntimeException(
+ "second URL in annotation is incorrect");
+ }
+
+ System.err.println("TEST PASSED: annotation matched codebase");
+ } catch (Exception e) {
+ TestLibrary.bomb(e.getMessage(), e);
+ }
+ }
+
+ private static URL[] pathToURLs(String path)
+ throws MalformedURLException
+ {
+ StringTokenizer st = new StringTokenizer(path); // divide by spaces
+ URL[] urls = new URL[st.countTokens()];
+ for (int i = 0; st.hasMoreTokens(); i++) {
+ urls[i] = new URL(st.nextToken());
+ }
+ return urls;
+ }
+
+ private static void dumpURL(URL u) {
+ System.err.println("\tprotocol: " + u.getProtocol());
+ System.err.println("\tauthority: " + u.getAuthority());
+ System.err.println("\tuser info: " + u.getUserInfo());
+ System.err.println("\thost: " + u.getHost());
+ System.err.println("\tport: " + u.getPort());
+ System.err.println("\tpath: " + u.getPath());
+ System.err.println("\tfile: " + u.getFile());
+ System.err.println("\tquery: " + u.getQuery());
+ System.err.println("\tref: " + u.getRef());
+ }
+}