jdk/test/java/rmi/server/RMIClassLoader/useGetURLs/UseGetURLs.java
changeset 2 90ce3da70b43
child 5506 202f599c92aa
--- /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());
+    }
+}