/**
* Plugin for NanoVM.
*/
package org.eclipse.nanovm.internal.ui.launch;
import java.io.File;
import java.text.MessageFormat;
import java.util.Map;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.debug.core.ILaunch;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.launching.ExecutionArguments;
import org.eclipse.jdt.launching.IJavaLaunchConfigurationConstants;
import org.eclipse.jdt.launching.IVMRunner;
import org.eclipse.jdt.launching.JavaLaunchDelegate;
import org.eclipse.jdt.launching.VMRunnerConfiguration;
import org.eclipse.nanovm.ui.NanoVMUI;
/**
* Launcher class.
*
* @author tugstugi@yahoo.com
*/
public class NanoVMLauncher extends JavaLaunchDelegate {
@Override
public void launch(ILaunchConfiguration configuration, String mode,
ILaunch launch, IProgressMonitor monitor) throws CoreException {
if (monitor == null) {
monitor = new NullProgressMonitor();
}
monitor.beginTask(MessageFormat.format(
"{0}...", new Object[] { configuration.getName() }), 3); //$NON-NLS-1$
// check for cancellation
if (monitor.isCanceled()) {
return;
}
monitor.subTask("Verifying launch attributes...");
IVMRunner runner = getVMRunner(configuration, mode);
File workingDir = verifyWorkingDirectory(configuration);
String workingDirName = null;
if (workingDir != null) {
workingDirName = workingDir.getAbsolutePath();
}
// Environment variables
String[] envp = getEnvironment(configuration);
// Program & VM arguments
String projectName = configuration.getAttribute(
IJavaLaunchConfigurationConstants.ATTR_PROJECT_NAME, "");
IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(
projectName);
IPath projectPath = project.getLocation();
IJavaProject javaProject = JavaCore.create(project);
IPath classPath = ResourcesPlugin.getWorkspace().getRoot()
.getLocation().append(javaProject.getOutputLocation());
String configFile = configuration.getAttribute(
NanoVMUI.ATTR_CONFIGURATION_NAME, "");
IPath configPath = projectPath.append(configFile);
String mainClassToLaucn = configuration.getAttribute(
NanoVMUI.ATTR_MAIN_CLASS_NAME, "");
String pgmArgs = getProgramArguments(configuration) + " "
+ "\"" + configPath.toOSString() + "\"" + " " + "\"" + classPath.toOSString() + "\"" + " "
+ mainClassToLaucn.replace('.', '/');
String vmArgs = getVMArguments(configuration);
ExecutionArguments execArgs = new ExecutionArguments(vmArgs, pgmArgs);
// VM-specific attributes
Map vmAttributesMap = getVMSpecificAttributesMap(configuration);
// Classpath
String[] classpath = getClasspath(configuration);
// Create VM config
VMRunnerConfiguration runConfig = new VMRunnerConfiguration(
"NanoVMTool", classpath);
runConfig.setProgramArguments(execArgs.getProgramArgumentsArray());
runConfig.setEnvironment(envp);
runConfig.setVMArguments(execArgs.getVMArgumentsArray());
runConfig.setWorkingDirectory(workingDirName);
runConfig.setVMSpecificAttributesMap(vmAttributesMap);
// Bootpath
runConfig.setBootClassPath(getBootpath(configuration));
// check for cancellation
if (monitor.isCanceled()) {
return;
}
// stop in main
prepareStopInMain(configuration);
// done the verification phase
monitor.worked(1);
monitor.subTask("Creating source locator..");
// set the default source locator if required
setDefaultSourceLocator(launch, configuration);
monitor.worked(1);
// Launch the configuration - 1 unit of work
runner.run(runConfig, launch, monitor);
// check for cancellation
if (monitor.isCanceled()) {
return;
}
monitor.done();
}
}