blob: 0ca6cc3388055a1ba58b3c512fe0c13165b54e92 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2015 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.jdi.internal;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.MissingResourceException;
import java.util.PropertyResourceBundle;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.preferences.IPreferencesService;
import org.eclipse.jdi.internal.connect.SocketAttachingConnectorImpl;
import org.eclipse.jdi.internal.connect.SocketLaunchingConnectorImpl;
import org.eclipse.jdi.internal.connect.SocketListeningConnectorImpl;
import org.eclipse.jdi.internal.connect.SocketRawLaunchingConnectorImpl;
import org.eclipse.jdt.debug.core.JDIDebugModel;
import com.sun.jdi.VirtualMachine;
import com.sun.jdi.VirtualMachineManager;
import com.sun.jdi.connect.AttachingConnector;
import com.sun.jdi.connect.Connector;
import com.sun.jdi.connect.LaunchingConnector;
import com.sun.jdi.connect.ListeningConnector;
import com.sun.jdi.connect.spi.Connection;
/**
* this class implements the corresponding interfaces declared by the JDI
* specification. See the com.sun.jdi package for more information.
*/
public class VirtualMachineManagerImpl implements VirtualMachineManager {
/** Major interface version. */
public static int MAJOR_INTERFACE_VERSION = 1;
/** Minor interface version. */
public static int MINOR_INTERFACE_VERSION = 5;
/**
* PrintWriter where verbose info is written to, null if no verbose must be
* given.
*/
private PrintWriter fVerbosePrintWriter = null;
/** List of all VMs that are currently connected. */
List<VirtualMachine> fConnectedVMs = new ArrayList<>();
/** True if in verbose mode. */
private boolean fVerbose = false;
/** Name of verbose file. */
private String fVerboseFile = null;
/**
* Creates new VirtualMachineManagerImpl.
*/
public VirtualMachineManagerImpl() {
getPreferences();
// See if verbose info must be given.
if (fVerbose) {
OutputStream out;
if (fVerboseFile != null && fVerboseFile.length() > 0) {
try {
out = new FileOutputStream(fVerboseFile);
} catch (IOException e) {
out = System.out;
System.out
.println(JDIMessages.VirtualMachineManagerImpl_Could_not_open_verbose_file___1
+ fVerboseFile
+ JDIMessages.VirtualMachineManagerImpl_____2
+ e); //
}
} else {
out = System.out;
}
fVerbosePrintWriter = new PrintWriter(out);
}
}
/* (non-Javadoc)
* @see com.sun.jdi.VirtualMachineManager#majorInterfaceVersion()
*/
@Override
public int majorInterfaceVersion() {
return MAJOR_INTERFACE_VERSION;
}
/* (non-Javadoc)
* @see com.sun.jdi.VirtualMachineManager#minorInterfaceVersion()
*/
@Override
public int minorInterfaceVersion() {
return MINOR_INTERFACE_VERSION;
}
/**
* Loads the user preferences from the jdi.ini file.
*/
private void getPreferences() {
// Get jdi.ini info.
URL url = getClass().getResource("/jdi.ini"); //$NON-NLS-1$
if (url == null) {
return;
}
try {
InputStream stream = url.openStream();
PropertyResourceBundle prefs = new PropertyResourceBundle(stream);
try {
fVerbose = Boolean
.valueOf(prefs.getString("User.verbose")).booleanValue(); //$NON-NLS-1$
} catch (MissingResourceException e) {
}
try {
fVerboseFile = prefs.getString("Verbose.out"); //$NON-NLS-1$
} catch (MissingResourceException e) {
}
} catch (IOException e) {
}
}
/**
* @return Returns Timeout value for requests to VM, if not overridden for
* the VM. This value is used to throw the exception
* TimeoutException in JDI calls. NOTE: This is not in compliance
* with the Sun's JDI.
*/
public int getGlobalRequestTimeout() {
try {
IPreferencesService srvc = Platform.getPreferencesService();
if(srvc != null) {
return Platform.getPreferencesService().getInt(
JDIDebugModel.getPluginIdentifier(),
JDIDebugModel.PREF_REQUEST_TIMEOUT,
JDIDebugModel.DEF_REQUEST_TIMEOUT,
null);
}
} catch (NoClassDefFoundError e) {
}
// return the hard coded preference if the JDI debug plug-in does not
// exist
return JDIDebugModel.DEF_REQUEST_TIMEOUT;
}
/**
* Adds a VM to the connected VM list.
*/
public void addConnectedVM(VirtualMachineImpl vm) {
fConnectedVMs.add(vm);
}
/**
* Removes a VM from the connected VM list.
*/
public void removeConnectedVM(VirtualMachineImpl vm) {
fConnectedVMs.remove(vm);
}
/* (non-Javadoc)
* @see com.sun.jdi.VirtualMachineManager#connectedVirtualMachines()
*/
@Override
public List<VirtualMachine> connectedVirtualMachines() {
return fConnectedVMs;
}
/* (non-Javadoc)
* @see com.sun.jdi.VirtualMachineManager#allConnectors()
*/
@Override
public List<Connector> allConnectors() {
List<Connector> result = new ArrayList<>(attachingConnectors());
result.addAll(launchingConnectors());
result.addAll(listeningConnectors());
return result;
}
/* (non-Javadoc)
* @see com.sun.jdi.VirtualMachineManager#attachingConnectors()
*/
@Override
public List<AttachingConnector> attachingConnectors() {
ArrayList<AttachingConnector> list = new ArrayList<>(1);
list.add(new SocketAttachingConnectorImpl(this));
return list;
}
/* (non-Javadoc)
* @see com.sun.jdi.VirtualMachineManager#launchingConnectors()
*/
@Override
public List<LaunchingConnector> launchingConnectors() {
ArrayList<LaunchingConnector> list = new ArrayList<>(2);
list.add(new SocketLaunchingConnectorImpl(this));
list.add(new SocketRawLaunchingConnectorImpl(this));
return list;
}
/* (non-Javadoc)
* @see com.sun.jdi.VirtualMachineManager#listeningConnectors()
*/
@Override
public List<ListeningConnector> listeningConnectors() {
ArrayList<ListeningConnector> list = new ArrayList<>(1);
list.add(new SocketListeningConnectorImpl(this));
return list;
}
/* (non-Javadoc)
* @see com.sun.jdi.VirtualMachineManager#defaultConnector()
*/
@Override
public LaunchingConnector defaultConnector() {
return new SocketLaunchingConnectorImpl(this);
}
/**
* @return Returns PrintWriter to which verbose info must be written, or
* null if no verbose must be given.
*/
public PrintWriter verbosePrintWriter() {
return fVerbosePrintWriter;
}
/* (non-Javadoc)
* @see com.sun.jdi.VirtualMachineManager#createVirtualMachine(com.sun.jdi.connect.spi.Connection)
*/
@Override
public VirtualMachine createVirtualMachine(Connection connection) throws IOException {
VirtualMachineImpl vmImpl = new VirtualMachineImpl(connection);
return vmImpl;
}
/* (non-Javadoc)
* @see com.sun.jdi.VirtualMachineManager#createVirtualMachine(com.sun.jdi.connect.spi.Connection, java.lang.Process)
*/
@Override
public VirtualMachine createVirtualMachine(Connection connection, Process process) throws IOException {
VirtualMachineImpl vmImpl = new VirtualMachineImpl(connection);
vmImpl.setLaunchedProcess(process);
return vmImpl;
}
}