blob: d74ca017c6688553decd7d98994e5e3d50fb0b46 [file] [log] [blame]
/*
* Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
package sun.jvm.hotspot;
import java.io.*;
import java.net.*;
import java.rmi.*;
import java.rmi.registry.*;
import sun.jvm.hotspot.debugger.DebuggerException;
public class RMIHelper {
private static final boolean startRegistry;
private static int port;
private static String serverNamePrefix;
static {
String tmp = System.getProperty("sun.jvm.hotspot.rmi.startRegistry");
if (tmp != null && tmp.equals("false")) {
startRegistry = false;
} else {
// by default, we attempt to start rmiregistry
startRegistry = true;
}
port = Registry.REGISTRY_PORT;
tmp = System.getProperty("sun.jvm.hotspot.rmi.port");
if (tmp != null) {
try {
port = Integer.parseInt(tmp);
} catch (NumberFormatException nfe) {
System.err.println("invalid port supplied, assuming default");
}
}
tmp = System.getProperty("sun.jvm.hotspot.rmi.serverNamePrefix");
serverNamePrefix = (tmp != null)? serverNamePrefix : "SARemoteDebugger";
}
public static void rebind(String uniqueID, Remote object) throws DebuggerException {
String name = getName(uniqueID);
try {
Naming.rebind(name, object);
} catch (RemoteException re) {
if (startRegistry) {
// may be the user didn't start rmiregistry, try to start it
try {
LocateRegistry.createRegistry(port);
Naming.rebind(name, object);
} catch (Exception exp) {
throw new DebuggerException(exp);
}
} else {
throw new DebuggerException(re);
}
} catch (Exception exp) {
throw new DebuggerException(exp);
}
}
public static void unbind(String uniqueID) throws DebuggerException {
String name = getName(uniqueID);
try {
Naming.unbind(name);
} catch (Exception exp) {
throw new DebuggerException(exp);
}
}
public static Remote lookup(String debugServerID) throws DebuggerException {
// debugServerID follows the pattern [unique_id@]host[:port]
// we have to transform this as //host[:port]/<serverNamePrefix>['_'<unique_id>]
int index = debugServerID.indexOf('@');
StringBuffer nameBuf = new StringBuffer("//");
String uniqueID = null;
if (index != -1) {
nameBuf.append(debugServerID.substring(index + 1));
uniqueID = debugServerID.substring(0, index);
} else {
nameBuf.append(debugServerID);
}
nameBuf.append('/');
nameBuf.append(serverNamePrefix);
if (uniqueID != null) {
nameBuf.append('_');
nameBuf.append(uniqueID);
}
try {
return Naming.lookup(nameBuf.toString());
} catch (Exception exp) {
throw new DebuggerException(exp);
}
}
private static String getName(String uniqueID) {
String name = null;
if (uniqueID != null) {
name = serverNamePrefix + "_" + uniqueID;
} else {
name = serverNamePrefix;
}
if (port != Registry.REGISTRY_PORT) {
name = "//localhost:" + port + "/" + name;
}
return name;
}
}