3038N/A * Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved. 0N/A * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 0N/A * This code is free software; you can redistribute it and/or modify it 0N/A * under the terms of the GNU General Public License version 2 only, as 2362N/A * published by the Free Software Foundation. Oracle designates this 0N/A * particular file as subject to the "Classpath" exception as provided 2362N/A * by Oracle in the LICENSE file that accompanied this code. 0N/A * This code is distributed in the hope that it will be useful, but WITHOUT 0N/A * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 0N/A * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 0N/A * version 2 for more details (a copy is included in the LICENSE file that 0N/A * accompanied this code). 0N/A * You should have received a copy of the GNU General Public License version 0N/A * 2 along with this work; if not, write to the Free Software Foundation, 0N/A * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 2362N/A * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 2362N/A * or visit www.oracle.com if you need additional information or have any 0N/A * <p>A connection to a remote RMI connector. Usually, such 0N/A * connections are made using {@link 0N/A * javax.management.remote.JMXConnectorFactory JMXConnectorFactory}. 0N/A * However, specialized applications can use this class directly, for 0N/A * example with an {@link RMIServer} stub obtained without going 0N/A * <p>Constructs an <code>RMIConnector</code> that will connect 0N/A * the RMI connector server with the given address.</p> 0N/A * <p>The address can refer directly to the connector server, 0N/A * using one of the following syntaxes:</p> 0N/A * service:jmx:rmi://<em>[host[:port]]</em>/stub/<em>encoded-stub</em> 0N/A * service:jmx:iiop://<em>[host[:port]]</em>/ior/<em>encoded-IOR</em> 0N/A * <p>(Here, the square brackets <code>[]</code> are not part of the 0N/A * address but indicate that the host and port are optional.)</p> 0N/A * <p>The address can instead indicate where to find an RMI stub 0N/A * through JNDI, using one of the following syntaxes:</p> 0N/A * service:jmx:rmi://<em>[host[:port]]</em>/jndi/<em>jndi-name</em> 0N/A * service:jmx:iiop://<em>[host[:port]]</em>/jndi/<em>jndi-name</em> 0N/A * <p>An implementation may also recognize additional address 0N/A * syntaxes, for example:</p> 0N/A * service:jmx:iiop://<em>[host[:port]]</em>/stub/<em>encoded-stub</em> 0N/A * @param url the address of the RMI connector server. 0N/A * @param environment additional attributes specifying how to make 0N/A * the connection. For JNDI-based addresses, these attributes can 0N/A * usefully include JNDI attributes recognized by {@link 0N/A * InitialContext#InitialContext(Hashtable) InitialContext}. This 0N/A * parameter can be null, which is equivalent to an empty Map. 0N/A * @exception IllegalArgumentException if <code>url</code> 0N/A * <p>Constructs an <code>RMIConnector</code> using the given RMI stub. 0N/A * @param rmiServer an RMI stub representing the RMI connector server. 0N/A * @param environment additional attributes specifying how to make 0N/A * the connection. This parameter can be null, which is 0N/A * equivalent to an empty Map. 0N/A * @exception IllegalArgumentException if <code>rmiServer</code> 0N/A * <p>Returns a string representation of this object. In general, 0N/A * the <code>toString</code> method returns a string that 0N/A * "textually represents" this object. The result should be a 0N/A * concise but informative representation that is easy for a 0N/A * person to read.</p> 0N/A * @return a String representation of this object. 0N/A * <p>The address of this connector.</p> 0N/A * @return the address of this connector, or null if it 0N/A * does not have one. 0N/A //-------------------------------------------------------------------- 0N/A // implements JMXConnector interface 0N/A //-------------------------------------------------------------------- 0N/A // Get RMIServer stub from directory or URL encoding if needed. 0N/A // Check for secure RMIServer stub if the corresponding 0N/A // client-side environment property is set to "true". 0N/A // Connect IIOP Stub if needed. 0N/A // Calling newClient on the RMIServer stub. 0N/A // Always use one of: 0N/A // ClassLoader provided in Map at connect time, 0N/A // or contextClassLoader at connect time. 0N/A // The connectionId variable is used in doStart(), when 0N/A // reconnecting, to identify the "old" connection. 699N/A "Successful connection",
0N/A final String msg =
"Failed to retrieve RMIServer stub: " + e;
0N/A // we do a remote call to have an IOException if the connection is broken. 0N/A // see the bug 4939578 699N/A "] is not connected.");
0N/A // allows to do close after setting the flag "terminated" to true. 0N/A // It is necessary to avoid a deadlock, see 6296324 0N/A // Return if already cleanly closed. 0N/A // Already closed, but not cleanly. Attempt again. 699N/A " RMI Notification client terminated.");
699N/A " Failed to terminate RMI Notification client: " + x);
0N/A // OK, the server maybe closed itself. 699N/A " Failed to close RMIServer: " + e);
0N/A // Clean up MBeanServerConnection table 0N/A /* Send notification of closure. We don't do this if the user 0N/A * never called connect() on the connector, because there's no 0N/A * connection id in that case. */ 699N/A "Client has been closed",
0N/A // throw exception if needed 0N/A // added for re-connection 699N/A "(ObjectName,MarshalledObject,Subject)");
0N/A // added for re-connection 699N/A "(ObjectName[],MarshalledObject[],Subject[])");
0N/A // send a failed notif if necessary 0N/A //-------------------------------------------------------------------- 0N/A // Implementation of MBeanServerConnection 0N/A //-------------------------------------------------------------------- 699N/A "createMBean(String,ObjectName,ObjectName,Object[],String[])",
699N/A "(ObjectName,ObjectName,NotificationFilter,Object)",
699N/A "(ObjectName,ObjectName)",
699N/A "(ObjectName,ObjectName,NotificationFilter,Object)",
0N/A // Specific Notification Handle ---------------------------------- 699N/A "(ObjectName,NotificationListener,"+
699N/A "NotificationFilter,Object)",
699N/A "(ObjectName,NotificationListener)",
699N/A "(ObjectName,NotificationListener,"+
699N/A "NotificationFilter,Object)",
0N/A //-------------------------------------------------------------------- 0N/A while (
true) {
// used for a successful re-connection 0N/A // inform of IOException 0N/A // The connection should be re-established. 0N/A // No more fetch, the Exception will be re-thrown. 0N/A // specially treating for an UnmarshalException 0N/A /* In Sun's RMI implementation, if a method return 0N/A contains an unserializable object, then we get 0N/A UnmarshalException wrapping WriteAbortedException 0N/A wrapping NotSerializableException. In that case we 0N/A extract the NotSerializableException so that our 0N/A caller can realize it should try to skip past the 0N/A notification that presumably caused it. It's not 0N/A certain that every other RMI implementation will 0N/A generate this exact exception sequence. If not, we 0N/A will not detect that the problem is due to an 0N/A unserializable object, and we will stop trying to 0N/A receive notifications from the server. It's not 0N/A clear we can do much better. */ 0N/A // IIOP will throw MarshalException wrapping a NotSerializableException 0N/A // when a server fails to serialize a response. 0N/A // Not serialization problem, simply re-throw the orginal exception 0N/A // check if the connection is broken 0N/A synchronized(
this) {
0N/A // we should close the connection, 0N/A // but send a failed notif at first 0N/A // forward the exception 0N/A /* Need to unwrap the exception. 0N/A Some user-thrown exception at server side will be wrapped by 0N/A rmi into a ServerException. 0N/A For example, a RMIConnnectorServer will wrap a 0N/A ClassNotFoundException into a UnmarshalException, and rmi 0N/A will throw a ServerException at client side which wraps this 0N/A No failed notif here. 0N/A // OK, we will do one by one 699N/A "Can't reconnect listener for " +
699N/A "Calling the method getDefaultDomain.");
0N/A // Get RMIServer stub from directory or URL encoding if needed. 0N/A // Connect IIOP Stub if needed. 0N/A // Calling newClient on the RMIServer stub. 699N/A "Reconnected to server",
699N/A "Failed to call the method close():" +
ioe);
0N/A //-------------------------------------------------------------------- 0N/A // Private stuff - Serialization 0N/A //-------------------------------------------------------------------- 0N/A * <p>In order to be usable, an IIOP stub must be connected to an ORB. 0N/A * The stub is automatically connected to the ORB if: 0N/A * <li> It was returned by the COS naming</li> 0N/A * <li> Its server counterpart has been registered in COS naming 0N/A * through JNDI.</li> 0N/A * Otherwise, it is not connected. A stub which is deserialized 0N/A * from Jini is not connected. A stub which is obtained from a 0N/A * non registered RMIIIOPServerImpl is not a connected.<br> 0N/A * A stub which is not connected can't be serialized, and thus 0N/A * can't be registered in Jini. A stub which is not connected can't 0N/A * be used to invoke methods on the server. 0N/A * In order to palliate this, this method will connect the 0N/A * given stub if it is not yet connected. If the given 0N/A * <var>RMIServer</var> is not an instance of 0N/A * {@link javax.rmi.CORBA.Stub javax.rmi.CORBA.Stub}, then the 0N/A * method do nothing and simply returns that stub. Otherwise, 0N/A * this method will attempt to connect the stub to an ORB as 0N/A * <p>This method looks in the provided <var>environment</var> for 0N/A * the "java.naming.corba.orb" property. If it is found, the 0N/A * referenced object (an {@link org.omg.CORBA.ORB ORB}) is used to 0N/A * connect the stub. Otherwise, a new org.omg.CORBA.ORB is created 0N/A * org.omg.CORBA.ORB#init(String[], Properties) 0N/A * <p>The new created ORB is kept in a static 0N/A * {@link WeakReference} and can be reused for connecting other 0N/A * stubs. However, no reference is ever kept on the ORB provided 0N/A * in the <var>environment</var> map, if any. 0N/A * @param rmiServer A RMI Server Stub. 0N/A * @param environment An environment map, possibly containing an ORB. 0N/A * @return the given stub. 0N/A * @exception IllegalArgumentException if the 0N/A * <tt>java.naming.corba.orb</tt> property is specified and 0N/A * does not point to an {@link org.omg.CORBA.ORB ORB}. 0N/A * @exception IOException if the connection to the ORB failed. 0N/A * Get the ORB specified by <var>environment</var>, or create a 0N/A * <p>This method looks in the provided <var>environment</var> for 0N/A * the "java.naming.corba.orb" property. If it is found, the 0N/A * referenced object (an {@link org.omg.CORBA.ORB ORB}) is 0N/A * returned. Otherwise, a new org.omg.CORBA.ORB is created 0N/A * <p>The new created ORB is kept in a static 0N/A * {@link WeakReference} and can be reused for connecting other 0N/A * stubs. However, no reference is ever kept on the ORB provided 0N/A * in the <var>environment</var> map, if any. 0N/A * @param environment An environment map, possibly containing an ORB. 0N/A * @exception IllegalArgumentException if the 0N/A * <tt>java.naming.corba.orb</tt> property is specified and 0N/A * does not point to an {@link org.omg.CORBA.ORB ORB}. 0N/A * @exception IOException if the ORB initialization failed. 699N/A " must be an instance of org.omg.CORBA.ORB.");
0N/A * Read RMIConnector fields from an {@link java.io.ObjectInputStream 0N/A * ObjectInputStream}. 0N/A * Calls <code>s.defaultReadObject()</code> and then initializes 0N/A * all transient variables that need initializing. 0N/A * @param s The ObjectInputStream to read from. 0N/A * @exception InvalidObjectException if none of <var>rmiServer</var> stub 0N/A * or <var>jmxServiceURL</var> are set. 0N/A * @see #RMIConnector(JMXServiceURL,Map) 0N/A * @see #RMIConnector(RMIServer,Map) 0N/A * Writes the RMIConnector fields to an {@link java.io.ObjectOutputStream 0N/A * ObjectOutputStream}. 0N/A * <p>Connects the underlying RMIServer stub to an ORB, if needed, 0N/A * before serializing it. This is done using the environment 0N/A * map that was provided to the constructor, if any, and as documented 0N/A * in {@link javax.management.remote.rmi}.</p> 0N/A * <p>This method then calls <code>s.defaultWriteObject()</code>. 0N/A * Usually, <var>rmiServer</var> is null if this object 0N/A * was constructed with a JMXServiceURL, and <var>jmxServiceURL</var> 0N/A * is null if this object is constructed with a RMIServer stub. 0N/A * <p>Note that the environment Map is not serialized, since the objects 0N/A * it contains are assumed to be contextual and relevant only 0N/A * with respect to the local environment (class loader, ORB, etc...).</p> 0N/A * <p>After an RMIConnector is deserialized, it is assumed that the 0N/A * user will call {@link #connect(Map)}, providing a new Map that 0N/A * can contain values which are contextually relevant to the new 0N/A * local environment.</p> 0N/A * <p>Since connection to the ORB is needed prior to serializing, and 0N/A * since the ORB to connect to is one of those contextual parameters, 0N/A * it is not recommended to re-serialize a just de-serialized object - 0N/A * as the de-serialized object has no map. Thus, when an RMIConnector 0N/A * object is needed for serialization or transmission to a remote 0N/A * application, it is recommended to obtain a new RMIConnector stub 0N/A * by calling {@link RMIConnectorServer#toJMXConnector(Map)}.</p> 0N/A * @param s The ObjectOutputStream to write to. 0N/A * @exception InvalidObjectException if none of <var>rmiServer</var> stub 0N/A * or <var>jmxServiceURL</var> are set. 0N/A * @see #RMIConnector(JMXServiceURL,Map) 0N/A * @see #RMIConnector(RMIServer,Map) 0N/A // Initialization of transient variables. 0N/A //-------------------------------------------------------------------- 0N/A // Private stuff - Check if stub can be trusted. 0N/A //-------------------------------------------------------------------- 0N/A // Check remote stub is from the expected class. 699N/A "Expecting a dynamic proxy instance with a " +
699N/A " invocation handler!");
0N/A // Check RemoteRef in stub is from the expected class 0N/A // "sun.rmi.server.UnicastRef2". 699N/A " remote reference in stub!");
0N/A // Check RMIClientSocketFactory in stub is from the expected class 0N/A // "javax.rmi.ssl.SslRMIClientSocketFactory". 699N/A " RMI client socket factory in stub!");
0N/A //-------------------------------------------------------------------- 0N/A // Private stuff - RMIServer creation 0N/A //-------------------------------------------------------------------- 0N/A // Make sure java.naming.corba.orb is in the Map. 0N/A final String msg =
"URL path must begin with /jndi/ or /stub/ " +
0N/A * Lookup the RMIServer stub in a directory. 0N/A * @param jndiURL A JNDI URL indicating the location of the Stub 0N/A * (see {@link javax.management.remote.rmi}), e.g.: 0N/A * @param env the environment Map passed to the connector. 0N/A * @param isIiop true if the stub is expected to be an IIOP stub. 0N/A * @return The retrieved RMIServer stub. 0N/A * @exception NamingException if the stub couldn't be found. 0N/A // could forbid "rmi:" URL here -- but do we need to? 0N/A // could forbid "iiop:" URL here -- but do we need to? 0N/A The following section of code avoids a class loading problem 0N/A with RMI. The problem is that an RMI stub, when deserializing 0N/A a remote method return value or exception, will first of all 0N/A consult the first non-bootstrap class loader it finds in the 0N/A call stack. This can lead to behavior that is not portable 0N/A between implementations of the JMX Remote API. Notably, an 0N/A implementation on J2SE 1.4 will find the RMI stub's loader on 0N/A the stack. But in J2SE 5, this stub is loaded by the 0N/A bootstrap loader, so RMI will find the loader of the user code 0N/A that called an MBeanServerConnection method. 0N/A To avoid this problem, we take advantage of what the RMI stub 0N/A is doing internally. Each remote call will end up calling 0N/A ref.invoke(...), where ref is the RemoteRef parameter given to 0N/A the RMI stub's constructor. It is within this call that the 0N/A deserialization will happen. So we fabricate our own RemoteRef 0N/A that delegates everything to the "real" one but that is loaded 0N/A by a class loader that knows no other classes. The class 0N/A loader NoCallStackClassLoader does this: the RemoteRef is an 0N/A instance of the class named by proxyRefClassName, which is 0N/A fabricated by the class loader using byte code that is defined 0N/A by the string below. 0N/A The call stack when the deserialization happens is thus this: 0N/A MBeanServerConnection.getAttribute (or whatever) 0N/A -> RMIConnectionImpl_Stub.getAttribute 0N/A -> ProxyRef.invoke(...getAttribute...) 0N/A -> UnicastRef.invoke(...getAttribute...) 0N/A -> internal RMI stuff 0N/A Here UnicastRef is the RemoteRef created when the stub was 0N/A deserialized (which is of some RMI internal class). It and the 0N/A "internal RMI stuff" are loaded by the bootstrap loader, so are 0N/A transparent to the stack search. The first non-bootstrap 0N/A loader found is our ProxyRefLoader, as required. 0N/A In a future version of this code as integrated into J2SE 5, 0N/A this workaround could be replaced by direct access to the 0N/A internals of RMI. For now, we use the same code base for J2SE 0N/A and for the standalone Reference Implementation. 0N/A The byte code below encodes the following class, compiled using 0N/A J2SE 1.4.2 with the -g:none option. 0N/A package com.sun.jmx.remote.internal; 0N/A import java.lang.reflect.Method; 0N/A import java.rmi.Remote; 0N/A import java.rmi.server.RemoteRef; 0N/A import com.sun.jmx.remote.internal.ProxyRef; 0N/A public class PRef extends ProxyRef { 0N/A public PRef(RemoteRef ref) { 0N/A public Object invoke(Remote obj, Method method, 0N/A Object[] params, long opnum) 0N/A return ref.invoke(obj, method, params, opnum); 0N/A "com.sun.jmx.remote.internal.PRef";
699N/A "\312\376\272\276\0\0\0.\0\27\12\0\5\0\15\11\0\4\0\16\13\0\17\0"+
699N/A "s\7\0\23\14\0\6\0\7\14\0\24\0\25\7\0\26\14\0\11\0\12\1\0\40com/"+
699N/A "\0\2\0\1\0\6\0\7\0\1\0\10\0\0\0\22\0\2\0\2\0\0\0\6*+\267\0\1\261"+
699N/A "\0\0\0\0\0\1\0\11\0\12\0\2\0\10\0\0\0\33\0\6\0\6\0\0\0\17*\264\0"+
699N/A "\2+,-\26\4\271\0\3\6\0\260\0\0\0\0\0\13\0\0\0\4\0\1\0\14\0\0";
699N/A "Failed to instantiate " +
699N/A "Failed to initialize proxy reference constructor "+
0N/A The following code performs a similar trick for RMI/IIOP to the 0N/A one described above for RMI/JRMP. Unlike JRMP, though, we 0N/A can't easily insert an object between the RMIConnection stub 0N/A and the RMI/IIOP deserialization code, as explained below. 0N/A A method in an RMI/IIOP stub does the following. It makes an 0N/A org.omg.CORBA_2_3.portable.OutputStream for each request, and 0N/A writes the parameters to it. Then it calls 0N/A _invoke(OutputStream) which it inherits from CORBA's 0N/A ObjectImpl. That returns an 0N/A org.omg.CORBA_2_3.portable.InputStream. The return value is 0N/A read from this InputStream. So the stack during 0N/A deserialization looks like this: 0N/A MBeanServerConnection.getAttribute (or whatever) 0N/A -> _RMIConnection_Stub.getAttribute 0N/A -> Util.readAny (a CORBA method) 0N/A -> InputStream.read_any 0N/A -> internal CORBA stuff 0N/A What we would have *liked* to have done would be the same thing 0N/A as for RMI/JRMP. We create a "ProxyDelegate" that is an 0N/A org.omg.CORBA.portable.Delegate that simply forwards every 0N/A operation to the real original Delegate from the RMIConnection 0N/A stub, except that the InputStream returned by _invoke is 0N/A wrapped by a "ProxyInputStream" that is loaded by our 0N/A NoCallStackClassLoader. 0N/A Unfortunately, this doesn't work, at least with Sun's J2SE 0N/A 1.4.2, because the CORBA code is not designed to allow you to 0N/A change Delegates arbitrarily. You get a ClassCastException 0N/A from code that expects the Delegate to implement an internal 0N/A So instead we do the following. We create a subclass of the 0N/A stub that overrides the _invoke method so as to wrap the 0N/A returned InputStream in a ProxyInputStream. We create a 0N/A subclass of ProxyInputStream using the NoCallStackClassLoader 0N/A and override its read_any and read_value(Class) methods. 0N/A (These are the only methods called during deserialization of 0N/A MBeanServerConnection return values.) We extract the Delegate 0N/A from the original stub and insert it into our subclass stub, 0N/A and away we go. The state of a stub consists solely of its 0N/A We also need to catch ApplicationException, which will encode 0N/A any exceptions declared in the throws clause of the called 0N/A method. Its InputStream needs to be wrapped in a 0N/A ProxyInputSteam too. 0N/A We override _releaseReply in the stub subclass so that it 0N/A replaces a ProxyInputStream argument with the original 0N/A InputStream. This avoids problems if the implementation of 0N/A _releaseReply ends up casting this InputStream to an 0N/A implementation-specific interface (which in Sun's J2SE 5 it 0N/A It is not strictly necessary for the stub subclass to be loaded 0N/A by a NoCallStackClassLoader, since the call-stack search stops 0N/A at the ProxyInputStream subclass. However, it is convenient 0N/A for two reasons. One is that it means that the 0N/A ProxyInputStream subclass can be accessed directly, without 0N/A using reflection. The other is that it avoids build problems, 0N/A since usually stubs are created after other classes are 0N/A compiled, so we can't access them from this class without, 0N/A again, using reflection. 0N/A The strings below encode the following two Java classes, 1801N/A compiled using javac -g:none. 1801N/A package com.sun.jmx.remote.protocol.iiop; 0N/A import org.omg.CORBA.portable.ApplicationException; 0N/A import org.omg.CORBA.portable.InputStream; 0N/A import org.omg.CORBA.portable.OutputStream; 0N/A import org.omg.CORBA.portable.RemarshalException; 0N/A public class ProxyStub extends _RMIConnection_Stub { 0N/A public InputStream _invoke(OutputStream out) 0N/A throws ApplicationException, RemarshalException { 0N/A return new PInputStream(super._invoke(out)); 0N/A } catch (ApplicationException e) { 0N/A InputStream pis = new PInputStream(e.getInputStream()); 0N/A throw new ApplicationException(e.getId(), pis); 0N/A public void _releaseReply(InputStream in) { 1801N/A in = ((PInputStream)in).getProxiedInputStream(); 1801N/A package com.sun.jmx.remote.protocol.iiop; 0N/A public class PInputStream extends ProxyInputStream { 0N/A public PInputStream(org.omg.CORBA.portable.InputStream in) { 0N/A public org.omg.CORBA.Any read_any() { 0N/A return in.read_any(); 0N/A public java.io.Serializable read_value(Class clz) { 0N/A return narrow().read_value(clz); 1801N/A "com.sun.jmx.remote.protocol.iiop.ProxyStub";
1801N/A "com.sun.jmx.remote.protocol.iiop.ProxyInputStream";
1801N/A "com.sun.jmx.remote.protocol.iiop.PInputStream";
1801N/A "\312\376\272\276\0\0\0\63\0+\12\0\14\0\30\7\0\31\12\0\14\0\32\12"+
1801N/A "\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 "+
1801N/A "\12\0\14\0!\7\0\"\7\0#\1\0\6<init>\1\0\3()V\1\0\4Code\1\0\7_in"+
1801N/A "\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"+
1801N/A "*\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"+
1801N/A "\0'\273\0\2Y*+\267\0\3\267\0\4\260M\273\0\2Y,\266\0\6\267\0\4N"+
1801N/A "\273\0\5Y,\266\0\7-\267\0\10\277\0\1\0\0\0\14\0\15\0\5\0\1\0\22"+
1801N/A "\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"+
1801N/A "\1\0\17\0\0\0'\0\2\0\2\0\0\0\22+\306\0\13+\300\0\2\266\0\11L*+"+
1801N/A "\267\0\12\261\0\0\0\1\0\22\0\0\0\3\0\1\14\0\0";
1801N/A "\312\376\272\276\0\0\0\63\0\36\12\0\7\0\17\11\0\6\0\20\12\0\21"+
1801N/A "\0\22\12\0\6\0\23\12\0\24\0\25\7\0\26\7\0\27\1\0\6<init>\1\0'("+
1801N/A "\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"+
1801N/A "\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"+
699N/A "\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"+
699N/A "\11*\266\0\4+\266\0\5\260\0\0\0\0\0\0";
1801N/A "Unexpected exception making shadow IIOP stub class: "+e);
699N/A "stack search for classes: class loading semantics " +
699N/A "stack search for classes: class loading semantics " +
699N/A "may be incorrect: " + e);
0N/A // so just return the original stub, which will work for all 0N/A // but the most exotic class loading situations 699N/A "String length must be a multiple of four.");
0N/A // Translate all full groups from base64 to byte array elements 0N/A // Translate partial group, if present 0N/A // assert inCursor == s.length()-missingBytesInLastGroup; 0N/A // assert outCursor == result.length; 0N/A * Translates the specified character, which is assumed to be in the 0N/A * "Base 64 Alphabet" into its equivalent 6-bit positive integer. 0N/A * @throws IllegalArgumentException if 0N/A * c is not in the Base64 Alphabet. 0N/A * This array is a lookup table that translates unicode characters 0N/A * drawn from the "Base64 Alphabet" (as specified in Table 1 of RFC 2045) 0N/A * into their 6-bit positive integer equivalents. Characters that 0N/A * are not in the Base64 alphabet but fall within the bounds of the 0N/A * array are translated to -1. 0N/A -
1, -
1, -
1, -
1, -
1, -
1, -
1, -
1, -
1, -
1, -
1, -
1, -
1, -
1, -
1, -
1, -
1,
0N/A -
1, -
1, -
1, -
1, -
1, -
1, -
1, -
1, -
1, -
1, -
1, -
1, -
1, -
1, -
1, -
1, -
1,
0N/A -
1, -
1, -
1, -
1, -
1, -
1, -
1, -
1, -
1,
62, -
1, -
1, -
1,
63,
52,
53,
54,
0N/A 55,
56,
57,
58,
59,
60,
61, -
1, -
1, -
1, -
1, -
1, -
1, -
1,
0,
1,
2,
3,
4,
0N/A 5,
6,
7,
8,
9,
10,
11,
12,
13,
14,
15,
16,
17,
18,
19,
20,
21,
22,
23,
0N/A 24,
25, -
1, -
1, -
1, -
1, -
1, -
1,
26,
27,
28,
29,
30,
31,
32,
33,
34,
0N/A 35,
36,
37,
38,
39,
40,
41,
42,
43,
44,
45,
46,
47,
48,
49,
50,
51 0N/A //-------------------------------------------------------------------- 0N/A // Private stuff - Find / Set default class loader 0N/A //-------------------------------------------------------------------- 0N/A //-------------------------------------------------------------------- 0N/A // Private variables 0N/A //-------------------------------------------------------------------- 0N/A * @serial The RMIServer stub of the RMI JMX Connector server to 0N/A * which this client connector is (or will be) connected. This 0N/A * field can be null when <var>jmxServiceURL</var> is not 0N/A * null. This includes the case where <var>jmxServiceURL</var> 0N/A * contains a serialized RMIServer stub. If both 0N/A * <var>rmiServer</var> and <var>jmxServiceURL</var> are null then 0N/A * serialization will fail. 0N/A * @see #RMIConnector(RMIServer,Map) 0N/A * @serial The JMXServiceURL of the RMI JMX Connector server to 0N/A * which this client connector will be connected. This field can 0N/A * be null when <var>rmiServer</var> is not null. If both 0N/A * <var>rmiServer</var> and <var>jmxServiceURL</var> are null then 0N/A * serialization will fail. 0N/A * @see #RMIConnector(JMXServiceURL,Map) 0N/A // --------------------------------------------------------- 0N/A // WARNING - WARNING - WARNING - WARNING - WARNING - WARNING 0N/A // --------------------------------------------------------- 0N/A // Any transient variable which needs to be initialized should 0N/A // be initialized in the method initTransient() 0N/A // = new RMINotifClient(new Integer(0)); 0N/A * A static WeakReference to an {@link org.omg.CORBA.ORB ORB} to 0N/A * connect unconnected stubs.