This commit is contained in:
Abhijit Saha 2009-10-27 12:33:34 -07:00
commit 5b3e71f3bd
8 changed files with 589 additions and 100 deletions

View File

@ -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);
}
}

View File

@ -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;
}

View File

@ -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);
}
}

View File

@ -23,7 +23,7 @@
* have any questions. * have any questions.
*/ */
package com.sun.jmx.remote.internal; package com.sun.jmx.remote.protocol.iiop;
import java.io.IOException; import java.io.IOException;
import java.io.Serializable; import java.io.Serializable;

View File

@ -225,4 +225,72 @@ insert-buffer'd into a Java program."
(insert "\"") (insert "\"")
(switch-to-buffer buf))) (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("\"");
}
}
*/ */

View File

@ -29,8 +29,8 @@ import com.sun.jmx.mbeanserver.Util;
import com.sun.jmx.remote.internal.ClientCommunicatorAdmin; import com.sun.jmx.remote.internal.ClientCommunicatorAdmin;
import com.sun.jmx.remote.internal.ClientListenerInfo; import com.sun.jmx.remote.internal.ClientListenerInfo;
import com.sun.jmx.remote.internal.ClientNotifForwarder; 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.ProxyRef;
import com.sun.jmx.remote.internal.IIOPHelper;
import com.sun.jmx.remote.util.ClassLogger; import com.sun.jmx.remote.util.ClassLogger;
import com.sun.jmx.remote.util.EnvHelp; import com.sun.jmx.remote.util.EnvHelp;
import java.io.ByteArrayInputStream; import java.io.ByteArrayInputStream;
@ -101,12 +101,8 @@ import javax.management.remote.NotificationResult;
import javax.management.remote.JMXAddressable; import javax.management.remote.JMXAddressable;
import javax.naming.InitialContext; import javax.naming.InitialContext;
import javax.naming.NamingException; import javax.naming.NamingException;
import javax.rmi.CORBA.Stub;
import javax.rmi.PortableRemoteObject;
import javax.rmi.ssl.SslRMIClientSocketFactory; import javax.rmi.ssl.SslRMIClientSocketFactory;
import javax.security.auth.Subject; import javax.security.auth.Subject;
import org.omg.CORBA.BAD_OPERATION;
import org.omg.CORBA.ORB;
import sun.rmi.server.UnicastRef2; import sun.rmi.server.UnicastRef2;
import sun.rmi.transport.LiveRef; import sun.rmi.transport.LiveRef;
@ -1693,12 +1689,12 @@ public class RMIConnector implements JMXConnector, Serializable, JMXAddressable
static RMIServer connectStub(RMIServer rmiServer, static RMIServer connectStub(RMIServer rmiServer,
Map<String, ?> environment) Map<String, ?> environment)
throws IOException { throws IOException {
if (rmiServer instanceof javax.rmi.CORBA.Stub) { if (IIOPHelper.isStub(rmiServer)) {
javax.rmi.CORBA.Stub stub = (javax.rmi.CORBA.Stub) rmiServer;
try { try {
stub._orb(); IIOPHelper.getOrb(rmiServer);
} catch (BAD_OPERATION x) { } catch (UnsupportedOperationException x) {
stub.connect(resolveOrb(environment)); // BAD_OPERATION
IIOPHelper.connect(rmiServer, resolveOrb(environment));
} }
} }
return rmiServer; return rmiServer;
@ -1725,22 +1721,22 @@ public class RMIConnector implements JMXConnector, Serializable, JMXAddressable
* does not point to an {@link org.omg.CORBA.ORB ORB}. * does not point to an {@link org.omg.CORBA.ORB ORB}.
* @exception IOException if the ORB initialization failed. * @exception IOException if the ORB initialization failed.
**/ **/
static ORB resolveOrb(Map<String, ?> environment) static Object resolveOrb(Map<String, ?> environment)
throws IOException { throws IOException {
if (environment != null) { if (environment != null) {
final Object orb = environment.get(EnvHelp.DEFAULT_ORB); 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 + throw new IllegalArgumentException(EnvHelp.DEFAULT_ORB +
" must be an instance of org.omg.CORBA.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(); (RMIConnector.orb==null)?null:RMIConnector.orb.get();
if (orb != null) return orb; if (orb != null) return orb;
final ORB newOrb = final Object newOrb =
ORB.init((String[])null, (Properties)null); IIOPHelper.createOrb((String[])null, (Properties)null);
RMIConnector.orb = new WeakReference<ORB>(newOrb); RMIConnector.orb = new WeakReference<Object>(newOrb);
return newOrb; return newOrb;
} }
@ -1878,9 +1874,11 @@ public class RMIConnector implements JMXConnector, Serializable, JMXAddressable
return findRMIServerJNDI(path.substring(6,end), environment, isIiop); return findRMIServerJNDI(path.substring(6,end), environment, isIiop);
else if (path.startsWith("/stub/")) else if (path.startsWith("/stub/"))
return findRMIServerJRMP(path.substring(6,end), environment, isIiop); 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); return findRMIServerIIOP(path.substring(5,end), environment, isIiop);
else { } else {
final String msg = "URL path must begin with /jndi/ or /stub/ " + final String msg = "URL path must begin with /jndi/ or /stub/ " +
"or /ior/: " + path; "or /ior/: " + path;
throw new MalformedURLException(msg); throw new MalformedURLException(msg);
@ -1922,8 +1920,7 @@ public class RMIConnector implements JMXConnector, Serializable, JMXAddressable
private static RMIServer narrowIIOPServer(Object objref) { private static RMIServer narrowIIOPServer(Object objref) {
try { try {
return (RMIServer) return IIOPHelper.narrow(objref, RMIServer.class);
PortableRemoteObject.narrow(objref, RMIServer.class);
} catch (ClassCastException e) { } catch (ClassCastException e) {
if (logger.traceOn()) if (logger.traceOn())
logger.trace("narrowIIOPServer","Failed to narrow objref=" + logger.trace("narrowIIOPServer","Failed to narrow objref=" +
@ -1935,10 +1932,9 @@ public class RMIConnector implements JMXConnector, Serializable, JMXAddressable
private RMIServer findRMIServerIIOP(String ior, Map<String, ?> env, boolean isIiop) { private RMIServer findRMIServerIIOP(String ior, Map<String, ?> env, boolean isIiop) {
// could forbid "rmi:" URL here -- but do we need to? // could forbid "rmi:" URL here -- but do we need to?
final ORB orb = (ORB) final Object orb = env.get(EnvHelp.DEFAULT_ORB);
env.get(EnvHelp.DEFAULT_ORB); final Object stub = IIOPHelper.stringToObject(orb, ior);
final Object stub = orb.string_to_object(ior); return IIOPHelper.narrow(stub, RMIServer.class);
return (RMIServer) PortableRemoteObject.narrow(stub, RMIServer.class);
} }
private RMIServer findRMIServerJRMP(String base64, Map<String, ?> env, boolean isIiop) private RMIServer findRMIServerJRMP(String base64, Map<String, ?> env, boolean isIiop)
@ -1964,7 +1960,7 @@ public class RMIConnector implements JMXConnector, Serializable, JMXAddressable
} catch (ClassNotFoundException e) { } catch (ClassNotFoundException e) {
throw new MalformedURLException("Class not found: " + e); throw new MalformedURLException("Class not found: " + e);
} }
return (RMIServer) PortableRemoteObject.narrow(stub, RMIServer.class); return (RMIServer)stub;
} }
private static final class ObjectInputStreamWithLoader private static final class ObjectInputStreamWithLoader
@ -2205,9 +2201,9 @@ public class RMIConnector implements JMXConnector, Serializable, JMXAddressable
again, using reflection. again, using reflection.
The strings below encode the following two Java classes, 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; import org.omg.stub.javax.management.remote.rmi._RMIConnection_Stub;
@ -2228,12 +2224,13 @@ public class RMIConnector implements JMXConnector, Serializable, JMXAddressable
} }
public void _releaseReply(InputStream in) { public void _releaseReply(InputStream in) {
PInputStream pis = (PInputStream) in; if (in != null)
super._releaseReply(pis.getProxiedInputStream()); 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 class PInputStream extends ProxyInputStream {
public PInputStream(org.omg.CORBA.portable.InputStream in) { public PInputStream(org.omg.CORBA.portable.InputStream in) {
@ -2254,47 +2251,50 @@ public class RMIConnector implements JMXConnector, Serializable, JMXAddressable
private static final String iiopConnectionStubClassName = 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 = 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 = private static final String pInputStreamClassName =
"com.sun.jmx.remote.internal.PInputStream"; "com.sun.jmx.remote.protocol.iiop.PInputStream";
private static final Class<?> proxyStubClass; private static final Class<?> proxyStubClass;
static { static {
final String proxyStubByteCodeString = 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"+ "\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\31\7\0\32\12\0\5\0\33\12\0\5\0\34\12\0\5\0\35\12\0\2\0"+ "\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 "+
"\36\12\0\14\0\37\7\0\40\7\0!\1\0\6<init>\1\0\3()V\1\0\4Code\1"+ "\12\0\14\0!\7\0\"\7\0#\1\0\6<init>\1\0\3()V\1\0\4Code\1\0\7_in"+
"\0\7_invoke\1\0K(Lorg/omg/CORBA/portable/OutputStream;)Lorg/o"+ "voke\1\0K(Lorg/omg/CORBA/portable/OutputStream;)Lorg/omg/CORBA"+
"mg/CORBA/portable/InputStream;\1\0\12Exceptions\7\0\"\1\0\15_"+ "/portable/InputStream;\1\0\15StackMapTable\7\0\34\1\0\12Except"+
"releaseReply\1\0'(Lorg/omg/CORBA/portable/InputStream;)V\14\0"+ "ions\7\0$\1\0\15_releaseReply\1\0'(Lorg/omg/CORBA/portable/Inp"+
"\15\0\16\1\0(com/sun/jmx/remote/internal/PInputStream\14\0\20"+ "utStream;)V\14\0\15\0\16\1\0-com/sun/jmx/remote/protocol/iiop/"+
"\0\21\14\0\15\0\25\1\0+org/omg/CORBA/portable/ApplicationExce"+ "PInputStream\14\0\20\0\21\14\0\15\0\27\1\0+org/omg/CORBA/porta"+
"ption\14\0#\0$\14\0%\0&\14\0\15\0'\14\0(\0$\14\0\24\0\25\1\0%"+ "ble/ApplicationException\14\0%\0&\14\0'\0(\14\0\15\0)\14\0*\0&"+
"com/sun/jmx/remote/internal/ProxyStub\1\0<org/omg/stub/javax/"+ "\14\0\26\0\27\1\0*com/sun/jmx/remote/protocol/iiop/ProxyStub\1"+
"management/remote/rmi/_RMIConnection_Stub\1\0)org/omg/CORBA/p"+ "\0<org/omg/stub/javax/management/remote/rmi/_RMIConnection_Stu"+
"ortable/RemarshalException\1\0\16getInputStream\1\0&()Lorg/om"+ "b\1\0)org/omg/CORBA/portable/RemarshalException\1\0\16getInput"+
"g/CORBA/portable/InputStream;\1\0\5getId\1\0\24()Ljava/lang/S"+ "Stream\1\0&()Lorg/omg/CORBA/portable/InputStream;\1\0\5getId\1"+
"tring;\1\09(Ljava/lang/String;Lorg/omg/CORBA/portable/InputSt"+ "\0\24()Ljava/lang/String;\1\09(Ljava/lang/String;Lorg/omg/CORB"+
"ream;)V\1\0\25getProxiedInputStream\0!\0\13\0\14\0\0\0\0\0\3\0"+ "A/portable/InputStream;)V\1\0\25getProxiedInputStream\0!\0\13\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"+ "\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"+
"\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\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"+
"+\267\0\3\267\0\4\260M\273\0\2Y,\266\0\6\267\0\4N\273\0\5Y,\266"+ "\0'\273\0\2Y*+\267\0\3\267\0\4\260M\273\0\2Y,\266\0\6\267\0\4N"+
"\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"+ "\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\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\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"+
"\0\13+\300\0\2\266\0\11L*+\267\0\12\261\0\0\0\0\0\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 = 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"+ "\312\376\272\276\0\0\0\63\0\36\12\0\7\0\17\11\0\6\0\20\12\0\21"+
"\22\12\0\6\0\23\12\0\24\0\25\7\0\26\7\0\27\1\0\6<init>\1\0'(L"+ "\0\22\12\0\6\0\23\12\0\24\0\25\7\0\26\7\0\27\1\0\6<init>\1\0'("+
"org/omg/CORBA/portable/InputStream;)V\1\0\4Code\1\0\10read_an"+ "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/lan"+ "y\1\0\25()Lorg/omg/CORBA/Any;\1\0\12read_value\1\0)(Ljava/lang"+
"g/Class;)Ljava/io/Serializable;\14\0\10\0\11\14\0\30\0\31\7\0"+ "/Class;)Ljava/io/Serializable;\14\0\10\0\11\14\0\30\0\31\7\0\32"+
"\32\14\0\13\0\14\14\0\33\0\34\7\0\35\14\0\15\0\16\1\0(com/sun"+ "\14\0\13\0\14\14\0\33\0\34\7\0\35\14\0\15\0\16\1\0-com/sun/jmx"+
"/jmx/remote/internal/PInputStream\1\0,com/sun/jmx/remote/inte"+ "/remote/protocol/iiop/PInputStream\1\0\61com/sun/jmx/remote/pr"+
"rnal/ProxyInputStream\1\0\2in\1\0$Lorg/omg/CORBA/portable/Inp"+ "otocol/iiop/ProxyInputStream\1\0\2in\1\0$Lorg/omg/CORBA/portab"+
"utStream;\1\0\"org/omg/CORBA/portable/InputStream\1\0\6narrow"+ "le/InputStream;\1\0\"org/omg/CORBA/portable/InputStream\1\0\6n"+
"\1\0*()Lorg/omg/CORBA_2_3/portable/InputStream;\1\0&org/omg/C"+ "arrow\1\0*()Lorg/omg/CORBA_2_3/portable/InputStream;\1\0&org/o"+
"ORBA_2_3/portable/InputStream\0!\0\6\0\7\0\0\0\0\0\3\0\1\0\10"+ "mg/CORBA_2_3/portable/InputStream\0!\0\6\0\7\0\0\0\0\0\3\0\1\0"+
"\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"+ "\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\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\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"+ "\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"; "\11*\266\0\4+\266\0\5\260\0\0\0\0\0\0";
final byte[] proxyStubByteCode = final byte[] proxyStubByteCode =
@ -2305,12 +2305,12 @@ public class RMIConnector implements JMXConnector, Serializable, JMXAddressable
final byte[][] byteCodes = {proxyStubByteCode, pInputStreamByteCode}; final byte[][] byteCodes = {proxyStubByteCode, pInputStreamByteCode};
final String[] otherClassNames = { final String[] otherClassNames = {
iiopConnectionStubClassName, iiopConnectionStubClassName,
ProxyInputStream.class.getName(), ProxyInputStreamClassName,
}; };
if (IIOPHelper.isAvailable()) {
PrivilegedExceptionAction<Class<?>> action = PrivilegedExceptionAction<Class<?>> action =
new PrivilegedExceptionAction<Class<?>>() { new PrivilegedExceptionAction<Class<?>>() {
public Class<?> run() throws Exception { public Class<?> run() throws Exception {
Class thisClass = RMIConnector.class; Class thisClass = RMIConnector.class;
ClassLoader thisLoader = thisClass.getClassLoader(); ClassLoader thisLoader = thisClass.getClassLoader();
ProtectionDomain thisProtectionDomain = ProtectionDomain thisProtectionDomain =
@ -2334,12 +2334,15 @@ public class RMIConnector implements JMXConnector, Serializable, JMXAddressable
stubClass = null; stubClass = null;
} }
proxyStubClass = stubClass; proxyStubClass = stubClass;
} else {
proxyStubClass = null;
}
} }
private static RMIConnection shadowIiopStub(Stub stub) private static RMIConnection shadowIiopStub(Object stub)
throws InstantiationException, IllegalAccessException { throws InstantiationException, IllegalAccessException {
Stub proxyStub = (Stub) proxyStubClass.newInstance(); Object proxyStub = proxyStubClass.newInstance();
proxyStub._set_delegate(stub._get_delegate()); IIOPHelper.setDelegate(proxyStub, IIOPHelper.getDelegate(stub));
return (RMIConnection) proxyStub; return (RMIConnection) proxyStub;
} }
@ -2353,7 +2356,7 @@ public class RMIConnector implements JMXConnector, Serializable, JMXAddressable
if (c.getClass() == rmiConnectionImplStubClass) if (c.getClass() == rmiConnectionImplStubClass)
return shadowJrmpStub((RemoteObject) c); return shadowJrmpStub((RemoteObject) c);
if (c.getClass().getName().equals(iiopConnectionStubClassName)) if (c.getClass().getName().equals(iiopConnectionStubClassName))
return shadowIiopStub((Stub) c); return shadowIiopStub(c);
logger.trace("getConnection", logger.trace("getConnection",
"Did not wrap " + c.getClass() + " to foil " + "Did not wrap " + c.getClass() + " to foil " +
"stack search for classes: class loading semantics " + "stack search for classes: class loading semantics " +
@ -2539,7 +2542,7 @@ public class RMIConnector implements JMXConnector, Serializable, JMXAddressable
* A static WeakReference to an {@link org.omg.CORBA.ORB ORB} to * A static WeakReference to an {@link org.omg.CORBA.ORB ORB} to
* connect unconnected stubs. * connect unconnected stubs.
**/ **/
private static volatile WeakReference<ORB> orb = null; private static volatile WeakReference<Object> orb = null;
// TRACES & DEBUG // TRACES & DEBUG
//--------------- //---------------

View File

@ -27,6 +27,7 @@ package javax.management.remote.rmi;
import com.sun.jmx.remote.security.MBeanServerFileAccessController; 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.ClassLogger;
import com.sun.jmx.remote.util.EnvHelp; import com.sun.jmx.remote.util.EnvHelp;
@ -674,7 +675,7 @@ public class RMIConnectorServer extends JMXConnectorServer {
final int port; final int port;
if (address == null) { if (address == null) {
if (rmiServer instanceof javax.rmi.CORBA.Stub) if (IIOPHelper.isStub(rmiServer))
protocol = "iiop"; protocol = "iiop";
else else
protocol = "rmi"; protocol = "rmi";
@ -712,7 +713,7 @@ public class RMIConnectorServer extends JMXConnectorServer {
**/ **/
static String encodeStub( static String encodeStub(
RMIServer rmiServer, Map<String, ?> env) throws IOException { RMIServer rmiServer, Map<String, ?> env) throws IOException {
if (rmiServer instanceof javax.rmi.CORBA.Stub) if (IIOPHelper.isStub(rmiServer))
return "/ior/" + encodeIIOPStub(rmiServer, env); return "/ior/" + encodeIIOPStub(rmiServer, env);
else else
return "/stub/" + encodeJRMPStub(rmiServer, env); return "/stub/" + encodeJRMPStub(rmiServer, env);
@ -733,10 +734,9 @@ public class RMIConnectorServer extends JMXConnectorServer {
RMIServer rmiServer, Map<String, ?> env) RMIServer rmiServer, Map<String, ?> env)
throws IOException { throws IOException {
try { try {
javax.rmi.CORBA.Stub stub = Object orb = IIOPHelper.getOrb(rmiServer);
(javax.rmi.CORBA.Stub) rmiServer; return IIOPHelper.objectToString(orb, rmiServer);
return stub._orb().object_to_string(stub); } catch (RuntimeException x) {
} catch (org.omg.CORBA.BAD_OPERATION x) {
throw newIOException(x.getMessage(), x); throw newIOException(x.getMessage(), x);
} }
} }

View File

@ -33,9 +33,10 @@ import java.security.PrivilegedActionException;
import java.security.PrivilegedExceptionAction; import java.security.PrivilegedExceptionAction;
import java.util.Map; import java.util.Map;
import java.util.Collections; import java.util.Collections;
import javax.rmi.PortableRemoteObject;
import javax.security.auth.Subject; import javax.security.auth.Subject;
import com.sun.jmx.remote.internal.IIOPHelper;
/** /**
* <p>An {@link RMIServerImpl} that is exported through IIOP and that * <p>An {@link RMIServerImpl} that is exported through IIOP and that
* creates client connections as RMI objects exported through IIOP. * creates client connections as RMI objects exported through IIOP.
@ -65,7 +66,7 @@ public class RMIIIOPServerImpl extends RMIServerImpl {
} }
protected void export() throws IOException { protected void export() throws IOException {
PortableRemoteObject.exportObject(this); IIOPHelper.exportObject(this);
} }
protected String getProtocol() { protected String getProtocol() {
@ -83,7 +84,7 @@ public class RMIIIOPServerImpl extends RMIServerImpl {
public Remote toStub() throws IOException { public Remote toStub() throws IOException {
// javax.rmi.CORBA.Stub stub = // javax.rmi.CORBA.Stub stub =
// (javax.rmi.CORBA.Stub) PortableRemoteObject.toStub(this); // (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); // java.lang.System.out.println("NON CONNECTED STUB " + stub);
// org.omg.CORBA.ORB orb = // org.omg.CORBA.ORB orb =
// org.omg.CORBA.ORB.init((String[])null, (Properties)null); // org.omg.CORBA.ORB.init((String[])null, (Properties)null);
@ -117,12 +118,12 @@ public class RMIIIOPServerImpl extends RMIServerImpl {
RMIConnection client = RMIConnection client =
new RMIConnectionImpl(this, connectionId, getDefaultClassLoader(), new RMIConnectionImpl(this, connectionId, getDefaultClassLoader(),
subject, env); subject, env);
PortableRemoteObject.exportObject(client); IIOPHelper.exportObject(client);
return client; return client;
} }
protected void closeClient(RMIConnection client) throws IOException { protected void closeClient(RMIConnection client) throws IOException {
PortableRemoteObject.unexportObject(client); IIOPHelper.unexportObject(client);
} }
/** /**
@ -134,7 +135,7 @@ public class RMIIIOPServerImpl extends RMIServerImpl {
* server failed. * server failed.
*/ */
protected void closeServer() throws IOException { protected void closeServer() throws IOException {
PortableRemoteObject.unexportObject(this); IIOPHelper.unexportObject(this);
} }
@Override @Override