jdk/test/java/rmi/server/useCustomRef/UseCustomRef.java
changeset 2 90ce3da70b43
child 5506 202f599c92aa
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/rmi/server/useCustomRef/UseCustomRef.java	Sat Dec 01 00:00:00 2007 +0000
@@ -0,0 +1,218 @@
+/*
+ * Copyright 1998-2007 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 4155894
+ *
+ * @summary remote references can't be downloaded
+ * @author Ann Wollrath
+ *
+ * test currently needs RMISecurityManager because of
+ * 4180392
+ *
+ * @library ../../testlibrary
+ * @build UseCustomRef
+ * @build Ping
+ * @build UseCustomRef_Stub
+ * @build UseCustomRef_Skel
+ * @run main/othervm/policy=security.policy/secure=java.rmi.RMISecurityManager/timeout=120 UseCustomRef
+ *
+ * This test was failing to run because the synthetic access
+ * control context used by the application class loader to find and define
+ * CustomServerRef does not have accessClassInPackage.sun.rmi.server runtime
+ * permission necessary to load its superclass sun.rmi.server.UnicastServerRef,
+ * even though this test's code is granted that permission in its policy file.
+ * That bug number is 4256530
+ */
+
+import java.io.*;
+import java.rmi.*;
+import java.rmi.server.*;
+import java.rmi.registry.*;
+import sun.rmi.transport.LiveRef;
+
+public class UseCustomRef
+        extends RemoteServer
+        implements Ping
+{
+
+    public UseCustomRef() throws RemoteException {
+        exportObject();
+    }
+
+    public void exportObject() throws RemoteException {
+        ref = new CustomServerRef(new LiveRef(0));
+        ((ServerRef) ref).exportObject(this, null);
+    }
+
+    public RemoteRef getRef() { return ref; }
+
+    public void ping() {}
+
+    public void receiveAndPing(Ping p) throws RemoteException {
+        p.ping();
+    }
+
+    public static void main(String[] args) {
+        Ping obj = null;
+        Registry registry = null;
+
+        try {
+            /*
+             * create registry
+             */
+            TestLibrary.suggestSecurityManager("java.rmi.RMISecurityManager");
+
+            System.err.println("creating Registry...");
+            registry = LocateRegistry.createRegistry(TestLibrary.REGISTRY_PORT);
+
+            /*
+             * create object with custom ref and bind in registry
+             */
+            System.err.println("creating UseCustomRef...");
+            UseCustomRef cr = new UseCustomRef();
+            RemoteRef ref = cr.getRef();
+            if (!(ref instanceof CustomServerRef)) {
+                TestLibrary.bomb("test failed: reference not " +
+                                "instanceof CustomServerRef");
+            }
+
+            String name = "//:" + TestLibrary.REGISTRY_PORT + "/UseCustomRef";
+            //      String name = "UseCustomRef";
+            System.err.println("binding object in registry...");
+            Naming.rebind(name, cr);
+
+            /*
+             * look up object and invoke its ping method
+             */
+            System.err.println("ping object...");
+            obj = (Ping) Naming.lookup(name);
+            obj.ping();
+
+            /*
+             * pass object with custom ref in remote call
+             */
+            System.err.println("pass object in remote call...");
+            obj.receiveAndPing(cr);
+
+            /*
+             * write remote object with custom ref to output stream
+             */
+            System.err.println("writing remote object to stream...");
+            ByteArrayOutputStream bout = new ByteArrayOutputStream();
+            ObjectOutputStream out = new ObjectOutputStream(bout);
+            out.writeObject(cr);
+            out.flush();
+            out.close();
+
+            /*
+             * read back remote object from output stream
+             */
+            System.err.println("reading remote object from stream...");
+            ObjectInputStream in = new ObjectInputStream(
+                new ByteArrayInputStream(bout.toByteArray()));
+            cr = (UseCustomRef) in.readObject();
+
+            /*
+             * re-export object and ping
+             */
+            System.err.println("re-export object read...");
+            cr.exportObject();
+            System.err.println("look up object again...");
+            Naming.rebind(name, cr);
+            System.err.println("ping object read...");
+            obj = (Ping) Naming.lookup(name);
+            obj.ping();
+            System.err.println("TEST PASSED");
+            Naming.unbind(name);
+            cr = null;
+
+        } catch (Exception e) {
+            TestLibrary.bomb("test failed with exception: ", e);
+        } finally {
+            TestLibrary.unexport(obj);
+            TestLibrary.unexport(registry);
+
+            registry = null;
+            obj = null;
+        }
+    }
+
+    public static class CustomServerRef
+        extends sun.rmi.server.UnicastServerRef
+    {
+        public CustomServerRef() {}
+
+        public CustomServerRef(LiveRef ref) {
+            super(ref);
+        }
+        /*****
+        public CustomServerRef(int port,
+                               RMIClientSocketFactory csf,
+                               RMIServerSocketFactory ssf)
+        {
+            super (new LiveRef(port, csf, ssf));
+        }
+        *****/
+
+        public String getRefClass(ObjectOutput out) {
+            return "";
+        }
+
+        protected void unmarshalCustomCallData(ObjectInput in)
+            throws IOException, ClassNotFoundException
+        {
+            System.err.println("unmarshalling call data...");
+            String s = (String) (in.readObject());
+            System.err.println(s);
+        }
+
+        protected RemoteRef getClientRef() {
+            return new CustomRef(ref);
+        }
+    }
+
+    public static class CustomRef extends sun.rmi.server.UnicastRef {
+
+        public CustomRef() {
+        }
+
+        public CustomRef(sun.rmi.transport.LiveRef ref) {
+            super(ref);
+        }
+
+        protected void marshalCustomCallData(ObjectOutput out)
+            throws IOException
+        {
+            // this custom data ensures that a custom server
+            // ref has written the relevant information.
+            System.err.println("marshalling call data...");
+            out.writeObject("hello there.");
+        }
+
+        public String getRefClass(ObjectOutput out) {
+            return "";
+        }
+
+    }
+}