blob: 6b08810925bd6701bb322e0110d78037fd56aabd [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2012 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.jdt.internal.launching;
import java.io.File;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.SubProgressMonitor;
import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.ILaunch;
import org.eclipse.debug.core.model.IProcess;
import org.eclipse.jdt.launching.IVMInstall;
import org.eclipse.jdt.launching.JavaRuntime;
import org.eclipse.jdt.launching.LibraryLocation;
import org.eclipse.jdt.launching.VMRunnerConfiguration;
import com.ibm.icu.text.DateFormat;
/**
* A 1.1.x VM runner
*/
public class Standard11xVMRunner extends StandardVMRunner {
public Standard11xVMRunner(IVMInstall vmInstance) {
super(vmInstance);
}
/* (non-Javadoc)
* @see org.eclipse.jdt.launching.IVMRunner#run(org.eclipse.jdt.launching.VMRunnerConfiguration, org.eclipse.debug.core.ILaunch, org.eclipse.core.runtime.IProgressMonitor)
*/
@Override
public void run(VMRunnerConfiguration config, ILaunch launch, IProgressMonitor monitor) throws CoreException {
if (monitor == null) {
monitor = new NullProgressMonitor();
}
IProgressMonitor subMonitor = new SubProgressMonitor(monitor, 1);
subMonitor.beginTask(LaunchingMessages.StandardVMRunner_Launching_VM____1, 2);
subMonitor.subTask(LaunchingMessages.StandardVMRunner_Constructing_command_line____2); //
String program= constructProgramString(config);
List<String> arguments= new ArrayList<>();
arguments.add(program);
// VM arguments are the first thing after the java program so that users can specify
// options like '-client' & '-server' which are required to be the first option
String[] vmArgs= combineVmArgs(config, fVMInstance);
addArguments(vmArgs, arguments);
String[] bootCP= config.getBootClassPath();
String[] classPath = config.getClassPath();
String[] combinedPath = null;
if (bootCP == null) {
LibraryLocation[] locs = JavaRuntime.getLibraryLocations(fVMInstance);
bootCP = new String[locs.length];
for (int i = 0; i < locs.length; i++) {
bootCP[i] = locs[i].getSystemLibraryPath().toOSString();
}
}
combinedPath = new String[bootCP.length + classPath.length];
int offset = 0;
for (int i = 0; i < bootCP.length; i++) {
combinedPath[offset] = bootCP[i];
offset++;
}
for (int i = 0; i < classPath.length; i++) {
combinedPath[offset] = classPath[i];
offset++;
}
if (combinedPath.length > 0) {
arguments.add("-classpath"); //$NON-NLS-1$
arguments.add(convertClassPath(combinedPath));
}
arguments.add(config.getClassToLaunch());
String[] programArgs= config.getProgramArguments();
String[] envp = prependJREPath(config.getEnvironment());
int lastVMArgumentIndex = arguments.size() - 1;
addArguments(programArgs, arguments);
String[] cmdLine= new String[arguments.size()];
arguments.toArray(cmdLine);
// check for cancellation
if (monitor.isCanceled()) {
return;
}
File workingDir = getWorkingDir(config);
ClasspathShortener classpathShortener = new ClasspathShortener(fVMInstance, launch, cmdLine, lastVMArgumentIndex, workingDir, envp);
if (classpathShortener.shortenCommandLineIfNecessary()) {
cmdLine = classpathShortener.getCmdLine();
envp = classpathShortener.getEnvp();
}
subMonitor.worked(1);
subMonitor.subTask(LaunchingMessages.StandardVMRunner_Starting_virtual_machine____3);
Process p= null;
String[] newCmdLine = validateCommandLine(launch.getLaunchConfiguration(), cmdLine);
if(newCmdLine != null) {
cmdLine = newCmdLine;
}
p= exec(cmdLine, workingDir, envp);
if (p == null) {
return;
}
// check for cancellation
if (monitor.isCanceled()) {
p.destroy();
return;
}
String timestamp = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM).format(new Date(System.currentTimeMillis()));
IProcess process= DebugPlugin.newProcess(launch, p, renderProcessLabel(cmdLine, timestamp));
process.setAttribute(DebugPlugin.ATTR_PATH, cmdLine[0]);
process.setAttribute(IProcess.ATTR_CMDLINE, renderCommandLine(cmdLine));
String ltime = launch.getAttribute(DebugPlugin.ATTR_LAUNCH_TIMESTAMP);
process.setAttribute(DebugPlugin.ATTR_LAUNCH_TIMESTAMP, ltime != null ? ltime : timestamp);
if(workingDir != null) {
process.setAttribute(DebugPlugin.ATTR_WORKING_DIRECTORY, workingDir.getAbsolutePath());
}
if (!classpathShortener.getProcessTempFiles().isEmpty()) {
String tempFiles = classpathShortener.getProcessTempFiles().stream().map(file -> file.getAbsolutePath()).collect(Collectors.joining(File.pathSeparator));
process.setAttribute(LaunchingPlugin.ATTR_LAUNCH_TEMP_FILES, tempFiles);
}
subMonitor.worked(1);
}
}