changeset 1801:244a6868b440

6888179: Separate out dependency on CORBA Reviewed-by: dfuchs
author alanb
date Tue, 27 Oct 2009 08:55:35 +0000
parents 2a0ed9d89fb0
children 6764ef7d539d 252b17ca9abb 83817bb507c0
files src/share/classes/com/sun/jmx/remote/internal/IIOPHelper.java src/share/classes/com/sun/jmx/remote/internal/IIOPProxy.java src/share/classes/com/sun/jmx/remote/internal/ProxyInputStream.java src/share/classes/com/sun/jmx/remote/protocol/iiop/IIOPProxyImpl.java src/share/classes/com/sun/jmx/remote/protocol/iiop/ProxyInputStream.java src/share/classes/javax/management/remote/rmi/NoCallStackClassLoader.java src/share/classes/javax/management/remote/rmi/RMIConnector.java src/share/classes/javax/management/remote/rmi/RMIConnectorServer.java src/share/classes/javax/management/remote/rmi/RMIIIOPServerImpl.java
diffstat 9 files changed, 829 insertions(+), 340 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/classes/com/sun/jmx/remote/internal/IIOPHelper.java	Tue Oct 27 08:55:35 2009 +0000
@@ -0,0 +1,188 @@
+/*
+ * Copyright 2009 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.  Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 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.
+ */
+
+package com.sun.jmx.remote.internal;
+
+import java.util.Properties;
+import java.rmi.Remote;
+import java.rmi.RemoteException;
+import java.rmi.NoSuchObjectException;
+
+import java.util.Properties;
+import java.rmi.Remote;
+import java.rmi.RemoteException;
+import java.rmi.NoSuchObjectException;
+
+import java.security.AccessController;
+import java.security.PrivilegedAction;
+
+/**
+ * A helper class for RMI-IIOP and CORBA APIs.
+ */
+
+public final class IIOPHelper {
+    private IIOPHelper() { }
+
+    // loads IIOPProxy implementation class if available
+    private static final String IMPL_CLASS =
+        "com.sun.jmx.remote.protocol.iiop.IIOPProxyImpl";
+    private static final IIOPProxy proxy =
+        AccessController.doPrivileged(new PrivilegedAction<IIOPProxy>() {
+            public IIOPProxy run() {
+                try {
+                    Class<?> c = Class.forName(IMPL_CLASS, true, null);
+                    return (IIOPProxy)c.newInstance();
+                } catch (ClassNotFoundException cnf) {
+                    return null;
+                } catch (InstantiationException e) {
+                    throw new AssertionError(e);
+                } catch (IllegalAccessException e) {
+                    throw new AssertionError(e);
+                }
+            }});
+
+    /**
+     * Returns true if RMI-IIOP and CORBA is available.
+     */
+    public static boolean isAvailable() {
+        return proxy != null;
+    }
+
+    private static void ensureAvailable() {
+        if (proxy == null)
+            throw new AssertionError("Should not here");
+    }
+
+    /**
+     * Returns true if the given object is a Stub.
+     */
+    public static boolean isStub(Object obj) {
+        return (proxy == null) ? false : proxy.isStub(obj);
+    }
+
+    /**
+     * Returns the Delegate to which the given Stub delegates.
+     */
+    public static Object getDelegate(Object stub) {
+        ensureAvailable();
+        return proxy.getDelegate(stub);
+    }
+
+    /**
+     * Sets the Delegate for a given Stub.
+     */
+    public static void setDelegate(Object stub, Object delegate) {
+        ensureAvailable();
+        proxy.setDelegate(stub, delegate);
+    }
+
+    /**
+     * Returns the ORB associated with the given stub
+     *
+     * @throws  UnsupportedOperationException
+     *          if the object does not support the operation that
+     *          was invoked
+     */
+    public static Object getOrb(Object stub) {
+        ensureAvailable();
+        return proxy.getOrb(stub);
+    }
+
+    /**
+     * Connects the Stub to the given ORB.
+     */
+    public static void connect(Object stub, Object orb)
+        throws RemoteException
+    {
+        ensureAvailable();
+        proxy.connect(stub, orb);
+    }
+
+    /**
+     * Returns true if the given object is an ORB.
+     */
+    public static boolean isOrb(Object obj) {
+        ensureAvailable();
+        return proxy.isOrb(obj);
+    }
+
+    /**
+     * Creates, and returns, a new ORB instance.
+     */
+    public static Object createOrb(String[] args, Properties props) {
+        ensureAvailable();
+        return proxy.createOrb(args, props);
+    }
+
+    /**
+     * Converts a string, produced by the object_to_string method, back
+     * to a CORBA object reference.
+     */
+    public static Object stringToObject(Object orb, String str) {
+        ensureAvailable();
+        return proxy.stringToObject(orb, str);
+    }
+
+    /**
+     * Converts the given CORBA object reference to a string.
+     */
+    public static String objectToString(Object orb, Object obj) {
+        ensureAvailable();
+        return proxy.objectToString(orb, obj);
+    }
+
+    /**
+     * Checks to ensure that an object of a remote or abstract interface
+     * type can be cast to a desired type.
+     */
+    public static <T> T narrow(Object narrowFrom, Class<T> narrowTo) {
+        ensureAvailable();
+        return proxy.narrow(narrowFrom, narrowTo);
+    }
+
+    /**
+     * Makes a server object ready to receive remote calls
+     */
+    public static void exportObject(Remote obj) throws RemoteException {
+        ensureAvailable();
+        proxy.exportObject(obj);
+    }
+
+    /**
+     * Deregisters a server object from the runtime.
+     */
+    public static void unexportObject(Remote obj) throws NoSuchObjectException {
+        ensureAvailable();
+        proxy.unexportObject(obj);
+    }
+
+    /**
+     * Returns a stub for the given server object.
+     */
+    public static Remote toStub(Remote obj) throws NoSuchObjectException {
+        ensureAvailable();
+        return proxy.toStub(obj);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/classes/com/sun/jmx/remote/internal/IIOPProxy.java	Tue Oct 27 08:55:35 2009 +0000
@@ -0,0 +1,110 @@
+/*
+ * Copyright 2009 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.  Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 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.
+ */
+
+package com.sun.jmx.remote.internal;
+
+import java.util.Properties;
+import java.rmi.Remote;
+import java.rmi.RemoteException;
+import java.rmi.NoSuchObjectException;
+
+/**
+ * An interface to a subset of the RMI-IIOP and CORBA APIs to avoid a
+ * static dependencies on the types defined by these APIs.
+ */
+
+public interface IIOPProxy {
+
+    /**
+     * Returns true if the given object is a Stub.
+     */
+    boolean isStub(Object obj);
+
+    /**
+     * Returns the Delegate to which the given Stub delegates.
+     */
+    Object getDelegate(Object stub);
+
+    /**
+     * Sets the Delegate for a given Stub.
+     */
+    void setDelegate(Object stub, Object delegate);
+
+    /**
+     * Returns the ORB associated with the given stub
+     *
+     * @throws  UnsupportedOperationException
+     *          if the object does not support the operation that
+     *          was invoked
+     */
+    Object getOrb(Object stub);
+
+    /**
+     * Connects the Stub to the given ORB.
+     */
+    void connect(Object stub, Object orb) throws RemoteException;
+
+    /**
+     * Returns true if the given object is an ORB.
+     */
+    boolean isOrb(Object obj);
+
+    /**
+     * Creates, and returns, a new ORB instance.
+     */
+    Object createOrb(String[] args, Properties props);
+
+    /**
+     * Converts a string, produced by the object_to_string method, back
+     * to a CORBA object reference.
+     */
+    Object stringToObject(Object orb, String str);
+
+    /**
+     * Converts the given CORBA object reference to a string.
+     */
+    String objectToString(Object orb, Object obj);
+
+    /**
+     * Checks to ensure that an object of a remote or abstract interface
+     * type can be cast to a desired type.
+     */
+    <T> T narrow(Object narrowFrom, Class<T> narrowTo);
+
+    /**
+     * Makes a server object ready to receive remote calls
+     */
+    void exportObject(Remote obj) throws RemoteException;
+
+    /**
+     * Deregisters a server object from the runtime.
+     */
+    void unexportObject(Remote obj) throws NoSuchObjectException;
+
+    /**
+     * Returns a stub for the given server object.
+     */
+    Remote toStub(Remote obj) throws NoSuchObjectException;
+}
--- a/src/share/classes/com/sun/jmx/remote/internal/ProxyInputStream.java	Sat Oct 24 20:36:01 2009 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,241 +0,0 @@
-/*
- * Copyright 2003-2008 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.  Sun designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Sun 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 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.
- */
-
-package com.sun.jmx.remote.internal;
-
-import java.io.IOException;
-import java.io.Serializable;
-import java.math.BigDecimal;
-
-import org.omg.CORBA.Any;
-import org.omg.CORBA.Context;
-import org.omg.CORBA.NO_IMPLEMENT;
-import org.omg.CORBA.ORB;
-import org.omg.CORBA.TypeCode;
-import org.omg.CORBA.portable.BoxedValueHelper;
-
-@SuppressWarnings({"deprecation", "rawtypes"})
-public class ProxyInputStream extends org.omg.CORBA_2_3.portable.InputStream {
-    public ProxyInputStream(org.omg.CORBA.portable.InputStream in) {
-        this.in = in;
-    }
-
-    public boolean read_boolean() {
-        return in.read_boolean();
-    }
-
-    public char read_char() {
-        return in.read_char();
-    }
-
-    public char read_wchar() {
-        return in.read_wchar();
-    }
-
-    public byte read_octet() {
-        return in.read_octet();
-    }
-
-    public short read_short() {
-        return in.read_short();
-    }
-
-    public short read_ushort() {
-        return in.read_ushort();
-    }
-
-    public int read_long() {
-        return in.read_long();
-    }
-
-    public int read_ulong() {
-        return in.read_ulong();
-    }
-
-    public long read_longlong() {
-        return in.read_longlong();
-    }
-
-    public long read_ulonglong() {
-        return in.read_ulonglong();
-    }
-
-    public float read_float() {
-        return in.read_float();
-    }
-
-    public double read_double() {
-        return in.read_double();
-    }
-
-    public String read_string() {
-        return in.read_string();
-    }
-
-    public String read_wstring() {
-        return in.read_wstring();
-    }
-
-    public void read_boolean_array(boolean[] value, int offset, int length) {
-        in.read_boolean_array(value, offset, length);
-    }
-
-    public void read_char_array(char[] value, int offset, int length) {
-        in.read_char_array(value, offset, length);
-    }
-
-    public void read_wchar_array(char[] value, int offset, int length) {
-        in.read_wchar_array(value, offset, length);
-    }
-
-    public void read_octet_array(byte[] value, int offset, int length) {
-        in.read_octet_array(value, offset, length);
-    }
-
-    public void read_short_array(short[] value, int offset, int length) {
-        in.read_short_array(value, offset, length);
-    }
-
-    public void read_ushort_array(short[] value, int offset, int length) {
-        in.read_ushort_array(value, offset, length);
-    }
-
-    public void read_long_array(int[] value, int offset, int length) {
-        in.read_long_array(value, offset, length);
-    }
-
-    public void read_ulong_array(int[] value, int offset, int length) {
-        in.read_ulong_array(value, offset, length);
-    }
-
-    public void read_longlong_array(long[] value, int offset, int length) {
-        in.read_longlong_array(value, offset, length);
-    }
-
-    public void read_ulonglong_array(long[] value, int offset, int length) {
-        in.read_ulonglong_array(value, offset, length);
-    }
-
-    public void read_float_array(float[] value, int offset, int length) {
-        in.read_float_array(value, offset, length);
-    }
-
-    public void read_double_array(double[] value, int offset, int length) {
-        in.read_double_array(value, offset, length);
-    }
-
-    public org.omg.CORBA.Object read_Object() {
-        return in.read_Object();
-    }
-
-    public TypeCode read_TypeCode() {
-        return in.read_TypeCode();
-    }
-
-    public Any read_any() {
-        return in.read_any();
-    }
-
-    /**
-     * @deprecated
-     */
-    @Override
-    @Deprecated
-    public org.omg.CORBA.Principal read_Principal() {
-        return in.read_Principal();
-    }
-
-    @Override
-    public int read() throws IOException {
-        return in.read();
-    }
-
-    @Override
-    public BigDecimal read_fixed() {
-        return in.read_fixed();
-    }
-
-    @Override
-    public Context read_Context() {
-        return in.read_Context();
-    }
-
-    @Override
-    public org.omg.CORBA.Object read_Object(java.lang.Class clz) {
-        return in.read_Object(clz);
-    }
-
-    @Override
-    public ORB orb() {
-        return in.orb();
-    }
-
-    @Override
-    public Serializable read_value() {
-        return narrow().read_value();
-    }
-
-    @Override
-    public Serializable read_value(Class clz) {
-        return narrow().read_value(clz);
-    }
-
-    @Override
-    public Serializable read_value(BoxedValueHelper factory) {
-        return narrow().read_value(factory);
-    }
-
-    @Override
-    public Serializable read_value(String rep_id) {
-        return narrow().read_value(rep_id);
-    }
-
-    @Override
-    public Serializable read_value(Serializable value) {
-        return narrow().read_value(value);
-    }
-
-    @Override
-    public Object read_abstract_interface() {
-        return narrow().read_abstract_interface();
-    }
-
-    @Override
-    public Object read_abstract_interface(Class clz) {
-        return narrow().read_abstract_interface(clz);
-    }
-
-    protected org.omg.CORBA_2_3.portable.InputStream narrow() {
-        if (in instanceof org.omg.CORBA_2_3.portable.InputStream)
-            return (org.omg.CORBA_2_3.portable.InputStream) in;
-        throw new NO_IMPLEMENT();
-    }
-
-    public org.omg.CORBA.portable.InputStream getProxiedInputStream() {
-        return in;
-    }
-
-    protected final org.omg.CORBA.portable.InputStream in;
-}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/classes/com/sun/jmx/remote/protocol/iiop/IIOPProxyImpl.java	Tue Oct 27 08:55:35 2009 +0000
@@ -0,0 +1,119 @@
+/*
+ * Copyright 2009 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.  Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 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.
+ */
+
+package com.sun.jmx.remote.protocol.iiop;
+
+import org.omg.CORBA.ORB;
+import org.omg.CORBA.portable.Delegate;
+import javax.rmi.PortableRemoteObject;
+import javax.rmi.CORBA.Stub;
+
+import java.util.Properties;
+import java.rmi.Remote;
+import java.rmi.RemoteException;
+import java.rmi.NoSuchObjectException;
+
+import com.sun.jmx.remote.internal.IIOPProxy;
+
+/**
+ * An implementatin of IIOPProxy that simply delegates to the appropriate
+ * RMI-IIOP and CORBA APIs.
+ */
+
+public class IIOPProxyImpl implements IIOPProxy {
+    public IIOPProxyImpl() { }
+
+    @Override
+    public boolean isStub(Object obj) {
+        return (obj instanceof Stub);
+    }
+
+    @Override
+    public Object getDelegate(Object stub) {
+        return ((Stub)stub)._get_delegate();
+    }
+
+    @Override
+    public void setDelegate(Object stub, Object delegate) {
+        ((Stub)stub)._set_delegate((Delegate)delegate);
+    }
+
+    @Override
+    public Object getOrb(Object stub) {
+        try {
+            return ((Stub)stub)._orb();
+        } catch (org.omg.CORBA.BAD_OPERATION x) {
+            throw new UnsupportedOperationException(x);
+        }
+    }
+
+    @Override
+    public void connect(Object stub, Object orb)
+        throws RemoteException
+    {
+        ((Stub)stub).connect((ORB)orb);
+    }
+
+    @Override
+    public boolean isOrb(Object obj) {
+        return (obj instanceof ORB);
+    }
+
+    @Override
+    public Object createOrb(String[] args, Properties props) {
+        return ORB.init(args, props);
+    }
+
+    @Override
+    public Object stringToObject(Object orb, String str) {
+        return ((ORB)orb).string_to_object(str);
+    }
+
+    @Override
+    public String objectToString(Object orb, Object obj) {
+        return ((ORB)orb).object_to_string((org.omg.CORBA.Object)obj);
+    }
+
+    @Override
+    @SuppressWarnings("unchecked")
+    public <T> T narrow(Object narrowFrom, Class<T> narrowTo) {
+        return (T)PortableRemoteObject.narrow(narrowFrom, narrowTo);
+    }
+
+    @Override
+    public void exportObject(Remote obj) throws RemoteException {
+        PortableRemoteObject.exportObject(obj);
+    }
+
+    @Override
+    public void unexportObject(Remote obj) throws NoSuchObjectException {
+        PortableRemoteObject.unexportObject(obj);
+    }
+
+    @Override
+    public Remote toStub(Remote obj) throws NoSuchObjectException {
+        return PortableRemoteObject.toStub(obj);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/share/classes/com/sun/jmx/remote/protocol/iiop/ProxyInputStream.java	Tue Oct 27 08:55:35 2009 +0000
@@ -0,0 +1,241 @@
+/*
+ * Copyright 2003-2008 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.  Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 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.
+ */
+
+package com.sun.jmx.remote.protocol.iiop;
+
+import java.io.IOException;
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+import org.omg.CORBA.Any;
+import org.omg.CORBA.Context;
+import org.omg.CORBA.NO_IMPLEMENT;
+import org.omg.CORBA.ORB;
+import org.omg.CORBA.TypeCode;
+import org.omg.CORBA.portable.BoxedValueHelper;
+
+@SuppressWarnings({"deprecation", "rawtypes"})
+public class ProxyInputStream extends org.omg.CORBA_2_3.portable.InputStream {
+    public ProxyInputStream(org.omg.CORBA.portable.InputStream in) {
+        this.in = in;
+    }
+
+    public boolean read_boolean() {
+        return in.read_boolean();
+    }
+
+    public char read_char() {
+        return in.read_char();
+    }
+
+    public char read_wchar() {
+        return in.read_wchar();
+    }
+
+    public byte read_octet() {
+        return in.read_octet();
+    }
+
+    public short read_short() {
+        return in.read_short();
+    }
+
+    public short read_ushort() {
+        return in.read_ushort();
+    }
+
+    public int read_long() {
+        return in.read_long();
+    }
+
+    public int read_ulong() {
+        return in.read_ulong();
+    }
+
+    public long read_longlong() {
+        return in.read_longlong();
+    }
+
+    public long read_ulonglong() {
+        return in.read_ulonglong();
+    }
+
+    public float read_float() {
+        return in.read_float();
+    }
+
+    public double read_double() {
+        return in.read_double();
+    }
+
+    public String read_string() {
+        return in.read_string();
+    }
+
+    public String read_wstring() {
+        return in.read_wstring();
+    }
+
+    public void read_boolean_array(boolean[] value, int offset, int length) {
+        in.read_boolean_array(value, offset, length);
+    }
+
+    public void read_char_array(char[] value, int offset, int length) {
+        in.read_char_array(value, offset, length);
+    }
+
+    public void read_wchar_array(char[] value, int offset, int length) {
+        in.read_wchar_array(value, offset, length);
+    }
+
+    public void read_octet_array(byte[] value, int offset, int length) {
+        in.read_octet_array(value, offset, length);
+    }
+
+    public void read_short_array(short[] value, int offset, int length) {
+        in.read_short_array(value, offset, length);
+    }
+
+    public void read_ushort_array(short[] value, int offset, int length) {
+        in.read_ushort_array(value, offset, length);
+    }
+
+    public void read_long_array(int[] value, int offset, int length) {
+        in.read_long_array(value, offset, length);
+    }
+
+    public void read_ulong_array(int[] value, int offset, int length) {
+        in.read_ulong_array(value, offset, length);
+    }
+
+    public void read_longlong_array(long[] value, int offset, int length) {
+        in.read_longlong_array(value, offset, length);
+    }
+
+    public void read_ulonglong_array(long[] value, int offset, int length) {
+        in.read_ulonglong_array(value, offset, length);
+    }
+
+    public void read_float_array(float[] value, int offset, int length) {
+        in.read_float_array(value, offset, length);
+    }
+
+    public void read_double_array(double[] value, int offset, int length) {
+        in.read_double_array(value, offset, length);
+    }
+
+    public org.omg.CORBA.Object read_Object() {
+        return in.read_Object();
+    }
+
+    public TypeCode read_TypeCode() {
+        return in.read_TypeCode();
+    }
+
+    public Any read_any() {
+        return in.read_any();
+    }
+
+    /**
+     * @deprecated
+     */
+    @Override
+    @Deprecated
+    public org.omg.CORBA.Principal read_Principal() {
+        return in.read_Principal();
+    }
+
+    @Override
+    public int read() throws IOException {
+        return in.read();
+    }
+
+    @Override
+    public BigDecimal read_fixed() {
+        return in.read_fixed();
+    }
+
+    @Override
+    public Context read_Context() {
+        return in.read_Context();
+    }
+
+    @Override
+    public org.omg.CORBA.Object read_Object(java.lang.Class clz) {
+        return in.read_Object(clz);
+    }
+
+    @Override
+    public ORB orb() {
+        return in.orb();
+    }
+
+    @Override
+    public Serializable read_value() {
+        return narrow().read_value();
+    }
+
+    @Override
+    public Serializable read_value(Class clz) {
+        return narrow().read_value(clz);
+    }
+
+    @Override
+    public Serializable read_value(BoxedValueHelper factory) {
+        return narrow().read_value(factory);
+    }
+
+    @Override
+    public Serializable read_value(String rep_id) {
+        return narrow().read_value(rep_id);
+    }
+
+    @Override
+    public Serializable read_value(Serializable value) {
+        return narrow().read_value(value);
+    }
+
+    @Override
+    public Object read_abstract_interface() {
+        return narrow().read_abstract_interface();
+    }
+
+    @Override
+    public Object read_abstract_interface(Class clz) {
+        return narrow().read_abstract_interface(clz);
+    }
+
+    protected org.omg.CORBA_2_3.portable.InputStream narrow() {
+        if (in instanceof org.omg.CORBA_2_3.portable.InputStream)
+            return (org.omg.CORBA_2_3.portable.InputStream) in;
+        throw new NO_IMPLEMENT();
+    }
+
+    public org.omg.CORBA.portable.InputStream getProxiedInputStream() {
+        return in;
+    }
+
+    protected final org.omg.CORBA.portable.InputStream in;
+}
--- a/src/share/classes/javax/management/remote/rmi/NoCallStackClassLoader.java	Sat Oct 24 20:36:01 2009 +0100
+++ b/src/share/classes/javax/management/remote/rmi/NoCallStackClassLoader.java	Tue Oct 27 08:55:35 2009 +0000
@@ -225,4 +225,72 @@
     (insert "\"")
     (switch-to-buffer buf)))
 
+Alternatively, the following class reads a class file and outputs a string
+that can be used by the stringToBytes method above.
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+
+public class BytesToString {
+
+    public static void main(String[] args) throws IOException {
+        File f = new File(args[0]);
+        int len = (int)f.length();
+        byte[] classBytes = new byte[len];
+
+        FileInputStream in = new FileInputStream(args[0]);
+        try {
+            int pos = 0;
+            for (;;) {
+                int n = in.read(classBytes, pos, (len-pos));
+                if (n < 0)
+                    throw new RuntimeException("class file changed??");
+                pos += n;
+                if (pos >= n)
+                    break;
+            }
+        } finally {
+            in.close();
+        }
+
+        int pos = 0;
+        boolean lastWasOctal = false;
+        for (int i=0; i<len; i++) {
+            int value = classBytes[i];
+            if (value < 0)
+                value += 256;
+            String s = null;
+            if (value == '\\')
+                s = "\\\\";
+            else if (value == '\"')
+                s = "\\\"";
+            else {
+                if ((value >= 32 && value < 127) && ((!lastWasOctal ||
+                    (value < '0' || value > '7')))) {
+                    s = Character.toString((char)value);
+                }
+            }
+            if (s == null) {
+                s = "\\" + Integer.toString(value, 8);
+                lastWasOctal = true;
+            } else {
+                lastWasOctal = false;
+            }
+            if (pos > 61) {
+                System.out.print("\"");
+                if (i<len)
+                    System.out.print("+");
+                System.out.println();
+                pos = 0;
+            }
+            if (pos == 0)
+                System.out.print("                \"");
+            System.out.print(s);
+            pos += s.length();
+        }
+        System.out.println("\"");
+    }
+}
+
 */
--- a/src/share/classes/javax/management/remote/rmi/RMIConnector.java	Sat Oct 24 20:36:01 2009 +0100
+++ b/src/share/classes/javax/management/remote/rmi/RMIConnector.java	Tue Oct 27 08:55:35 2009 +0000
@@ -29,8 +29,8 @@
 import com.sun.jmx.remote.internal.ClientCommunicatorAdmin;
 import com.sun.jmx.remote.internal.ClientListenerInfo;
 import com.sun.jmx.remote.internal.ClientNotifForwarder;
-import com.sun.jmx.remote.internal.ProxyInputStream;
 import com.sun.jmx.remote.internal.ProxyRef;
+import com.sun.jmx.remote.internal.IIOPHelper;
 import com.sun.jmx.remote.util.ClassLogger;
 import com.sun.jmx.remote.util.EnvHelp;
 import java.io.ByteArrayInputStream;
@@ -101,12 +101,8 @@
 import javax.management.remote.JMXAddressable;
 import javax.naming.InitialContext;
 import javax.naming.NamingException;
-import javax.rmi.CORBA.Stub;
-import javax.rmi.PortableRemoteObject;
 import javax.rmi.ssl.SslRMIClientSocketFactory;
 import javax.security.auth.Subject;
-import org.omg.CORBA.BAD_OPERATION;
-import org.omg.CORBA.ORB;
 import sun.rmi.server.UnicastRef2;
 import sun.rmi.transport.LiveRef;
 
@@ -1693,12 +1689,12 @@
     static RMIServer connectStub(RMIServer rmiServer,
                                  Map<String, ?> environment)
         throws IOException {
-        if (rmiServer instanceof javax.rmi.CORBA.Stub) {
-            javax.rmi.CORBA.Stub stub = (javax.rmi.CORBA.Stub) rmiServer;
+        if (IIOPHelper.isStub(rmiServer)) {
             try {
-                stub._orb();
-            } catch (BAD_OPERATION x) {
-                stub.connect(resolveOrb(environment));
+                IIOPHelper.getOrb(rmiServer);
+            } catch (UnsupportedOperationException x) {
+                // BAD_OPERATION
+                IIOPHelper.connect(rmiServer, resolveOrb(environment));
             }
         }
         return rmiServer;
@@ -1725,22 +1721,22 @@
      *      does not point to an {@link org.omg.CORBA.ORB ORB}.
      * @exception IOException if the ORB initialization failed.
      **/
-    static ORB resolveOrb(Map<String, ?> environment)
+    static Object resolveOrb(Map<String, ?> environment)
         throws IOException {
         if (environment != null) {
             final Object orb = environment.get(EnvHelp.DEFAULT_ORB);
-            if (orb != null && !(orb instanceof  ORB))
+            if (orb != null && !(IIOPHelper.isOrb(orb)))
                 throw new IllegalArgumentException(EnvHelp.DEFAULT_ORB +
                         " must be an instance of org.omg.CORBA.ORB.");
-            if (orb != null) return (ORB)orb;
+            if (orb != null) return orb;
         }
-        final ORB orb =
+        final Object orb =
                 (RMIConnector.orb==null)?null:RMIConnector.orb.get();
         if (orb != null) return orb;
 
-        final ORB newOrb =
-                ORB.init((String[])null, (Properties)null);
-        RMIConnector.orb = new WeakReference<ORB>(newOrb);
+        final Object newOrb =
+                IIOPHelper.createOrb((String[])null, (Properties)null);
+        RMIConnector.orb = new WeakReference<Object>(newOrb);
         return newOrb;
     }
 
@@ -1878,9 +1874,11 @@
             return findRMIServerJNDI(path.substring(6,end), environment, isIiop);
         else if (path.startsWith("/stub/"))
             return findRMIServerJRMP(path.substring(6,end), environment, isIiop);
-        else if (path.startsWith("/ior/"))
+        else if (path.startsWith("/ior/")) {
+            if (!IIOPHelper.isAvailable())
+                throw new IOException("iiop protocol not available");
             return findRMIServerIIOP(path.substring(5,end), environment, isIiop);
-        else {
+        } else {
             final String msg = "URL path must begin with /jndi/ or /stub/ " +
                     "or /ior/: " + path;
             throw new MalformedURLException(msg);
@@ -1922,8 +1920,7 @@
 
     private static RMIServer narrowIIOPServer(Object objref) {
         try {
-            return (RMIServer)
-            PortableRemoteObject.narrow(objref, RMIServer.class);
+            return IIOPHelper.narrow(objref, RMIServer.class);
         } catch (ClassCastException e) {
             if (logger.traceOn())
                 logger.trace("narrowIIOPServer","Failed to narrow objref=" +
@@ -1935,10 +1932,9 @@
 
     private RMIServer findRMIServerIIOP(String ior, Map<String, ?> env, boolean isIiop) {
         // could forbid "rmi:" URL here -- but do we need to?
-        final ORB orb = (ORB)
-        env.get(EnvHelp.DEFAULT_ORB);
-        final Object stub = orb.string_to_object(ior);
-        return (RMIServer) PortableRemoteObject.narrow(stub, RMIServer.class);
+        final Object orb = env.get(EnvHelp.DEFAULT_ORB);
+        final Object stub = IIOPHelper.stringToObject(orb, ior);
+        return IIOPHelper.narrow(stub, RMIServer.class);
     }
 
     private RMIServer findRMIServerJRMP(String base64, Map<String, ?> env, boolean isIiop)
@@ -1964,7 +1960,7 @@
         } catch (ClassNotFoundException e) {
             throw new MalformedURLException("Class not found: " + e);
         }
-        return (RMIServer) PortableRemoteObject.narrow(stub, RMIServer.class);
+        return (RMIServer)stub;
     }
 
     private static final class ObjectInputStreamWithLoader
@@ -2205,9 +2201,9 @@
        again, using reflection.
 
        The strings below encode the following two Java classes,
-       compiled using J2SE 1.4.2 with javac -g:none.
+       compiled using javac -g:none.
 
-        package com.sun.jmx.remote.internal;
+        package com.sun.jmx.remote.protocol.iiop;
 
         import org.omg.stub.javax.management.remote.rmi._RMIConnection_Stub;
 
@@ -2228,12 +2224,13 @@
             }
 
             public void _releaseReply(InputStream in) {
-                PInputStream pis = (PInputStream) in;
-                super._releaseReply(pis.getProxiedInputStream());
+                if (in != null)
+                    in = ((PInputStream)in).getProxiedInputStream();
+                super._releaseReply(in);
             }
         }
 
-        package com.sun.jmx.remote.internal;
+        package com.sun.jmx.remote.protocol.iiop;
 
         public class PInputStream extends ProxyInputStream {
             public PInputStream(org.omg.CORBA.portable.InputStream in) {
@@ -2252,49 +2249,52 @@
 
      */
     private static final String iiopConnectionStubClassName =
-            "org.omg.stub.javax.management.remote.rmi._RMIConnection_Stub";
+        "org.omg.stub.javax.management.remote.rmi._RMIConnection_Stub";
     private static final String proxyStubClassName =
-            "com.sun.jmx.remote.internal.ProxyStub";
+        "com.sun.jmx.remote.protocol.iiop.ProxyStub";
+    private static final String ProxyInputStreamClassName =
+        "com.sun.jmx.remote.protocol.iiop.ProxyInputStream";
     private static final String pInputStreamClassName =
-        "com.sun.jmx.remote.internal.PInputStream";
+        "com.sun.jmx.remote.protocol.iiop.PInputStream";
     private static final Class<?> proxyStubClass;
     static {
         final String proxyStubByteCodeString =
-                "\312\376\272\276\0\0\0.\0)\12\0\14\0\26\7\0\27\12\0\14\0\30\12"+
-                "\0\2\0\31\7\0\32\12\0\5\0\33\12\0\5\0\34\12\0\5\0\35\12\0\2\0"+
-                "\36\12\0\14\0\37\7\0\40\7\0!\1\0\6<init>\1\0\3()V\1\0\4Code\1"+
-                "\0\7_invoke\1\0K(Lorg/omg/CORBA/portable/OutputStream;)Lorg/o"+
-                "mg/CORBA/portable/InputStream;\1\0\12Exceptions\7\0\"\1\0\15_"+
-                "releaseReply\1\0'(Lorg/omg/CORBA/portable/InputStream;)V\14\0"+
-                "\15\0\16\1\0(com/sun/jmx/remote/internal/PInputStream\14\0\20"+
-                "\0\21\14\0\15\0\25\1\0+org/omg/CORBA/portable/ApplicationExce"+
-                "ption\14\0#\0$\14\0%\0&\14\0\15\0'\14\0(\0$\14\0\24\0\25\1\0%"+
-                "com/sun/jmx/remote/internal/ProxyStub\1\0<org/omg/stub/javax/"+
-                "management/remote/rmi/_RMIConnection_Stub\1\0)org/omg/CORBA/p"+
-                "ortable/RemarshalException\1\0\16getInputStream\1\0&()Lorg/om"+
-                "g/CORBA/portable/InputStream;\1\0\5getId\1\0\24()Ljava/lang/S"+
-                "tring;\1\09(Ljava/lang/String;Lorg/omg/CORBA/portable/InputSt"+
-                "ream;)V\1\0\25getProxiedInputStream\0!\0\13\0\14\0\0\0\0\0\3\0"+
-                "\1\0\15\0\16\0\1\0\17\0\0\0\21\0\1\0\1\0\0\0\5*\267\0\1\261\0"+
-                "\0\0\0\0\1\0\20\0\21\0\2\0\17\0\0\0;\0\4\0\4\0\0\0'\273\0\2Y*"+
-                "+\267\0\3\267\0\4\260M\273\0\2Y,\266\0\6\267\0\4N\273\0\5Y,\266"+
-                "\0\7-\267\0\10\277\0\1\0\0\0\14\0\15\0\5\0\0\0\22\0\0\0\6\0\2"+
-                "\0\5\0\23\0\1\0\24\0\25\0\1\0\17\0\0\0\36\0\2\0\2\0\0\0\22+\306"+
-                "\0\13+\300\0\2\266\0\11L*+\267\0\12\261\0\0\0\0\0\0";
+                "\312\376\272\276\0\0\0\63\0+\12\0\14\0\30\7\0\31\12\0\14\0\32\12"+
+                "\0\2\0\33\7\0\34\12\0\5\0\35\12\0\5\0\36\12\0\5\0\37\12\0\2\0 "+
+                "\12\0\14\0!\7\0\"\7\0#\1\0\6<init>\1\0\3()V\1\0\4Code\1\0\7_in"+
+                "voke\1\0K(Lorg/omg/CORBA/portable/OutputStream;)Lorg/omg/CORBA"+
+                "/portable/InputStream;\1\0\15StackMapTable\7\0\34\1\0\12Except"+
+                "ions\7\0$\1\0\15_releaseReply\1\0'(Lorg/omg/CORBA/portable/Inp"+
+                "utStream;)V\14\0\15\0\16\1\0-com/sun/jmx/remote/protocol/iiop/"+
+                "PInputStream\14\0\20\0\21\14\0\15\0\27\1\0+org/omg/CORBA/porta"+
+                "ble/ApplicationException\14\0%\0&\14\0'\0(\14\0\15\0)\14\0*\0&"+
+                "\14\0\26\0\27\1\0*com/sun/jmx/remote/protocol/iiop/ProxyStub\1"+
+                "\0<org/omg/stub/javax/management/remote/rmi/_RMIConnection_Stu"+
+                "b\1\0)org/omg/CORBA/portable/RemarshalException\1\0\16getInput"+
+                "Stream\1\0&()Lorg/omg/CORBA/portable/InputStream;\1\0\5getId\1"+
+                "\0\24()Ljava/lang/String;\1\09(Ljava/lang/String;Lorg/omg/CORB"+
+                "A/portable/InputStream;)V\1\0\25getProxiedInputStream\0!\0\13\0"+
+                "\14\0\0\0\0\0\3\0\1\0\15\0\16\0\1\0\17\0\0\0\21\0\1\0\1\0\0\0\5"+
+                "*\267\0\1\261\0\0\0\0\0\1\0\20\0\21\0\2\0\17\0\0\0G\0\4\0\4\0\0"+
+                "\0'\273\0\2Y*+\267\0\3\267\0\4\260M\273\0\2Y,\266\0\6\267\0\4N"+
+                "\273\0\5Y,\266\0\7-\267\0\10\277\0\1\0\0\0\14\0\15\0\5\0\1\0\22"+
+                "\0\0\0\6\0\1M\7\0\23\0\24\0\0\0\6\0\2\0\5\0\25\0\1\0\26\0\27\0"+
+                "\1\0\17\0\0\0'\0\2\0\2\0\0\0\22+\306\0\13+\300\0\2\266\0\11L*+"+
+                "\267\0\12\261\0\0\0\1\0\22\0\0\0\3\0\1\14\0\0";
         final String pInputStreamByteCodeString =
-                "\312\376\272\276\0\0\0.\0\36\12\0\7\0\17\11\0\6\0\20\12\0\21\0"+
-                "\22\12\0\6\0\23\12\0\24\0\25\7\0\26\7\0\27\1\0\6<init>\1\0'(L"+
-                "org/omg/CORBA/portable/InputStream;)V\1\0\4Code\1\0\10read_an"+
-                "y\1\0\25()Lorg/omg/CORBA/Any;\1\0\12read_value\1\0)(Ljava/lan"+
-                "g/Class;)Ljava/io/Serializable;\14\0\10\0\11\14\0\30\0\31\7\0"+
-                "\32\14\0\13\0\14\14\0\33\0\34\7\0\35\14\0\15\0\16\1\0(com/sun"+
-                "/jmx/remote/internal/PInputStream\1\0,com/sun/jmx/remote/inte"+
-                "rnal/ProxyInputStream\1\0\2in\1\0$Lorg/omg/CORBA/portable/Inp"+
-                "utStream;\1\0\"org/omg/CORBA/portable/InputStream\1\0\6narrow"+
-                "\1\0*()Lorg/omg/CORBA_2_3/portable/InputStream;\1\0&org/omg/C"+
-                "ORBA_2_3/portable/InputStream\0!\0\6\0\7\0\0\0\0\0\3\0\1\0\10"+
-                "\0\11\0\1\0\12\0\0\0\22\0\2\0\2\0\0\0\6*+\267\0\1\261\0\0\0\0"+
-                "\0\1\0\13\0\14\0\1\0\12\0\0\0\24\0\1\0\1\0\0\0\10*\264\0\2\266"+
+                "\312\376\272\276\0\0\0\63\0\36\12\0\7\0\17\11\0\6\0\20\12\0\21"+
+                "\0\22\12\0\6\0\23\12\0\24\0\25\7\0\26\7\0\27\1\0\6<init>\1\0'("+
+                "Lorg/omg/CORBA/portable/InputStream;)V\1\0\4Code\1\0\10read_an"+
+                "y\1\0\25()Lorg/omg/CORBA/Any;\1\0\12read_value\1\0)(Ljava/lang"+
+                "/Class;)Ljava/io/Serializable;\14\0\10\0\11\14\0\30\0\31\7\0\32"+
+                "\14\0\13\0\14\14\0\33\0\34\7\0\35\14\0\15\0\16\1\0-com/sun/jmx"+
+                "/remote/protocol/iiop/PInputStream\1\0\61com/sun/jmx/remote/pr"+
+                "otocol/iiop/ProxyInputStream\1\0\2in\1\0$Lorg/omg/CORBA/portab"+
+                "le/InputStream;\1\0\"org/omg/CORBA/portable/InputStream\1\0\6n"+
+                "arrow\1\0*()Lorg/omg/CORBA_2_3/portable/InputStream;\1\0&org/o"+
+                "mg/CORBA_2_3/portable/InputStream\0!\0\6\0\7\0\0\0\0\0\3\0\1\0"+
+                "\10\0\11\0\1\0\12\0\0\0\22\0\2\0\2\0\0\0\6*+\267\0\1\261\0\0\0"+
+                "\0\0\1\0\13\0\14\0\1\0\12\0\0\0\24\0\1\0\1\0\0\0\10*\264\0\2\266"+
                 "\0\3\260\0\0\0\0\0\1\0\15\0\16\0\1\0\12\0\0\0\25\0\2\0\2\0\0\0"+
                 "\11*\266\0\4+\266\0\5\260\0\0\0\0\0\0";
         final byte[] proxyStubByteCode =
@@ -2305,12 +2305,12 @@
         final byte[][] byteCodes = {proxyStubByteCode, pInputStreamByteCode};
         final String[] otherClassNames = {
             iiopConnectionStubClassName,
-            ProxyInputStream.class.getName(),
+            ProxyInputStreamClassName,
         };
-        PrivilegedExceptionAction<Class<?>> action =
+        if (IIOPHelper.isAvailable()) {
+            PrivilegedExceptionAction<Class<?>> action =
                 new PrivilegedExceptionAction<Class<?>>() {
-            public Class<?> run() throws Exception {
-
+              public Class<?> run() throws Exception {
                 Class thisClass = RMIConnector.class;
                 ClassLoader thisLoader = thisClass.getClassLoader();
                 ProtectionDomain thisProtectionDomain =
@@ -2322,24 +2322,27 @@
                         thisLoader,
                         thisProtectionDomain);
                 return cl.loadClass(proxyStubClassName);
+              }
+            };
+            Class<?> stubClass;
+            try {
+                stubClass = AccessController.doPrivileged(action);
+            } catch (Exception e) {
+                logger.error("<clinit>",
+                        "Unexpected exception making shadow IIOP stub class: "+e);
+                logger.debug("<clinit>",e);
+                stubClass = null;
             }
-        };
-        Class<?> stubClass;
-        try {
-            stubClass = AccessController.doPrivileged(action);
-        } catch (Exception e) {
-            logger.error("<clinit>",
-                    "Unexpected exception making shadow IIOP stub class: "+e);
-            logger.debug("<clinit>",e);
-            stubClass = null;
+            proxyStubClass = stubClass;
+        } else {
+            proxyStubClass = null;
         }
-        proxyStubClass = stubClass;
     }
 
-    private static RMIConnection shadowIiopStub(Stub stub)
+    private static RMIConnection shadowIiopStub(Object stub)
     throws InstantiationException, IllegalAccessException {
-        Stub proxyStub = (Stub) proxyStubClass.newInstance();
-        proxyStub._set_delegate(stub._get_delegate());
+        Object proxyStub = proxyStubClass.newInstance();
+        IIOPHelper.setDelegate(proxyStub, IIOPHelper.getDelegate(stub));
         return (RMIConnection) proxyStub;
     }
 
@@ -2353,7 +2356,7 @@
             if (c.getClass() == rmiConnectionImplStubClass)
                 return shadowJrmpStub((RemoteObject) c);
             if (c.getClass().getName().equals(iiopConnectionStubClassName))
-                return shadowIiopStub((Stub) c);
+                return shadowIiopStub(c);
             logger.trace("getConnection",
                     "Did not wrap " + c.getClass() + " to foil " +
                     "stack search for classes: class loading semantics " +
@@ -2539,7 +2542,7 @@
      * A static WeakReference to an {@link org.omg.CORBA.ORB ORB} to
      * connect unconnected stubs.
      **/
-    private static volatile WeakReference<ORB> orb = null;
+    private static volatile WeakReference<Object> orb = null;
 
     // TRACES & DEBUG
     //---------------
--- a/src/share/classes/javax/management/remote/rmi/RMIConnectorServer.java	Sat Oct 24 20:36:01 2009 +0100
+++ b/src/share/classes/javax/management/remote/rmi/RMIConnectorServer.java	Tue Oct 27 08:55:35 2009 +0000
@@ -27,6 +27,7 @@
 
 
 import com.sun.jmx.remote.security.MBeanServerFileAccessController;
+import com.sun.jmx.remote.internal.IIOPHelper;
 import com.sun.jmx.remote.util.ClassLogger;
 import com.sun.jmx.remote.util.EnvHelp;
 
@@ -674,7 +675,7 @@
         final int port;
 
         if (address == null) {
-            if (rmiServer instanceof javax.rmi.CORBA.Stub)
+            if (IIOPHelper.isStub(rmiServer))
                 protocol = "iiop";
             else
                 protocol = "rmi";
@@ -712,7 +713,7 @@
      **/
     static String encodeStub(
             RMIServer rmiServer, Map<String, ?> env) throws IOException {
-        if (rmiServer instanceof javax.rmi.CORBA.Stub)
+        if (IIOPHelper.isStub(rmiServer))
             return "/ior/" + encodeIIOPStub(rmiServer, env);
         else
             return "/stub/" + encodeJRMPStub(rmiServer, env);
@@ -733,10 +734,9 @@
             RMIServer rmiServer, Map<String, ?> env)
             throws IOException {
         try {
-            javax.rmi.CORBA.Stub stub =
-                (javax.rmi.CORBA.Stub) rmiServer;
-            return stub._orb().object_to_string(stub);
-        } catch (org.omg.CORBA.BAD_OPERATION x) {
+            Object orb = IIOPHelper.getOrb(rmiServer);
+            return IIOPHelper.objectToString(orb, rmiServer);
+        } catch (RuntimeException x) {
             throw newIOException(x.getMessage(), x);
         }
     }
--- a/src/share/classes/javax/management/remote/rmi/RMIIIOPServerImpl.java	Sat Oct 24 20:36:01 2009 +0100
+++ b/src/share/classes/javax/management/remote/rmi/RMIIIOPServerImpl.java	Tue Oct 27 08:55:35 2009 +0000
@@ -33,9 +33,10 @@
 import java.security.PrivilegedExceptionAction;
 import java.util.Map;
 import java.util.Collections;
-import javax.rmi.PortableRemoteObject;
 import javax.security.auth.Subject;
 
+import com.sun.jmx.remote.internal.IIOPHelper;
+
 /**
  * <p>An {@link RMIServerImpl} that is exported through IIOP and that
  * creates client connections as RMI objects exported through IIOP.
@@ -65,7 +66,7 @@
     }
 
     protected void export() throws IOException {
-        PortableRemoteObject.exportObject(this);
+        IIOPHelper.exportObject(this);
     }
 
     protected String getProtocol() {
@@ -83,7 +84,7 @@
     public Remote toStub() throws IOException {
         // javax.rmi.CORBA.Stub stub =
         //    (javax.rmi.CORBA.Stub) PortableRemoteObject.toStub(this);
-        final Remote stub = PortableRemoteObject.toStub(this);
+        final Remote stub = IIOPHelper.toStub(this);
         // java.lang.System.out.println("NON CONNECTED STUB " + stub);
         // org.omg.CORBA.ORB orb =
         //    org.omg.CORBA.ORB.init((String[])null, (Properties)null);
@@ -117,12 +118,12 @@
         RMIConnection client =
             new RMIConnectionImpl(this, connectionId, getDefaultClassLoader(),
                                   subject, env);
-        PortableRemoteObject.exportObject(client);
+        IIOPHelper.exportObject(client);
         return client;
     }
 
     protected void closeClient(RMIConnection client) throws IOException {
-        PortableRemoteObject.unexportObject(client);
+        IIOPHelper.unexportObject(client);
     }
 
     /**
@@ -134,7 +135,7 @@
      * server failed.
      */
     protected void closeServer() throws IOException {
-        PortableRemoteObject.unexportObject(this);
+        IIOPHelper.unexportObject(this);
     }
 
     @Override