package tk.eclipse.plugin.jseditor.launch; import java.io.File; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Map; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IWorkspaceRoot; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.debug.core.DebugPlugin; import org.eclipse.debug.core.ILaunch; import org.eclipse.debug.core.ILaunchConfiguration; import org.eclipse.jdt.launching.AbstractJavaLaunchConfigurationDelegate; import org.eclipse.jdt.launching.ExecutionArguments; import org.eclipse.jdt.launching.IJavaLaunchConfigurationConstants; import org.eclipse.jdt.launching.IVMInstall; import org.eclipse.jdt.launching.IVMRunner; import org.eclipse.jdt.launching.VMRunnerConfiguration; /** * * @author Naoki Takezoe */ public class JavaScriptLaunchConfigurationDelegate extends AbstractJavaLaunchConfigurationDelegate { public void launch(ILaunchConfiguration configuration, String mode, ILaunch launch, IProgressMonitor monitor) throws CoreException { IVMInstall install = getVMInstall(configuration); IVMRunner runner = install.getVMRunner(launch.getLaunchMode()); if (runner == null) { abort("VM not found", null, IJavaLaunchConfigurationConstants.ERR_VM_RUNNER_DOES_NOT_EXIST); } //int port= SocketUtil.findFreePort(); VMRunnerConfiguration runConfig = launchTypes(configuration, mode); setDefaultSourceLocator(launch, configuration); runner.run(runConfig, launch, monitor); } protected VMRunnerConfiguration launchTypes(ILaunchConfiguration configuration, String mode) throws CoreException { File workingDir = verifyWorkingDirectory(configuration); String workingDirName = null; if (workingDir != null) workingDirName = workingDir.getAbsolutePath(); // Program & VM args String vmArgs = getVMArguments(configuration); ExecutionArguments execArgs = new ExecutionArguments(vmArgs, ""); String[] envp = DebugPlugin.getDefault().getLaunchManager().getEnvironment(configuration); // copy jar files which are required to execute JavaScript JavaScriptLaunchUtil.copyLibraries(); VMRunnerConfiguration runConfig = new VMRunnerConfiguration( JavaScriptLaunchConstants.JAVASCRIPT_EXECUTOR, JavaScriptLaunchUtil.getClassPathAsStringArray()); List<String> args = new ArrayList<String>(); String script = configuration.getAttribute( JavaScriptLaunchConstants.ATTR_JAVASCRIPT_FILE, ""); args.add(fixArgument(script)); List includes = configuration.getAttribute( JavaScriptLaunchConstants.ATTR_JAVASCRIPT_INCLUDES, Collections.EMPTY_LIST); IWorkspaceRoot wsroot = ResourcesPlugin.getWorkspace().getRoot(); for(int i=0;i<includes.size();i++){ String include = (String)includes.get(i); if(include.startsWith(JavaScriptLibraryTable.PREFIX)){ IResource resource = wsroot.findMember(include.substring(JavaScriptLibraryTable.PREFIX.length())); if(resource!=null && resource instanceof IFile && resource.exists()){ args.add(fixArgument(((IFile)resource).getLocation().toString())); } } else { args.add(fixArgument(include)); } } runConfig.setVMArguments(execArgs.getVMArgumentsArray()); runConfig.setProgramArguments(args.toArray(new String[args.size()])); runConfig.setWorkingDirectory(workingDirName); runConfig.setEnvironment(envp); Map vmAttributesMap = getVMSpecificAttributesMap(configuration); runConfig.setVMSpecificAttributesMap(vmAttributesMap); String[] bootpath = getBootpath(configuration); runConfig.setBootClassPath(bootpath); return runConfig; } private static String fixArgument(String arg){ if(arg.indexOf(' ')>=0){ return '"' + arg + '"'; } return arg; } }