package org.nodeclipse.phantomjs.launch; import java.io.File; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; 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.debug.core.ILaunchManager; import org.eclipse.debug.core.model.ILaunchConfigurationDelegate; import org.eclipse.debug.core.model.RuntimeProcess; import org.eclipse.jface.preference.IPreferenceStore; import org.nodeclipse.common.preferences.CommonDialogs; import org.nodeclipse.debug.util.Constants; import org.nodeclipse.debug.util.NodeDebugUtil; import org.nodeclipse.debug.util.VariablesUtil; import org.nodeclipse.phantomjs.preferences.PhantomjsConstants; import org.nodeclipse.ui.Activator; import org.nodeclipse.ui.preferences.PreferenceConstants; import org.nodeclipse.ui.util.NodeclipseConsole; /** * Launching PhantomJS is similar to Node.js <pre> D:\Progs\phantomjs-1.9.2-windows>phantomjs.exe --remote-debugger-port=6060 --remote-debugger-autorun=yes examples\arguments.js 123 0: examples\arguments.js 1: 123 Phantom::exit() called but not quitting in debug mode. </pre> * * @since 0.7 * @author Paul Verest */ public class LaunchConfigurationDelegate //extends org.nodeclipse.debug.launch.LaunchConfigurationDelegate implements ILaunchConfigurationDelegate { //@SuppressWarnings("unchecked") @Override public void launch(ILaunchConfiguration configuration, String mode, ILaunch launch, IProgressMonitor monitor) throws CoreException { //NodeclipseConsole.write("launch phantomjs\n"); IPreferenceStore preferenceStore = Activator.getDefault().getPreferenceStore(); boolean isDebugMode = mode.equals(ILaunchManager.DEBUG_MODE); // Using configuration to build command line List<String> cmdLine = new ArrayList<String>(); String phantomjsPath= preferenceStore.getString(PreferenceConstants.PHANTOMJS_PATH); // Check if the node location is correctly configured File phantomjsFile = new File(phantomjsPath); if(!phantomjsFile.exists()){ // If the location is not valid than show a dialog which prompts the user to goto the preferences page // Dialogs.showPreferencesDialog("PhantomJS runtime is not correctly configured.\n\n" // + "Please goto Window -> Prefrences -> Nodeclipse and configure the correct location under 'PhanthomJS path:'"); CommonDialogs.showPreferencesDialog(PhantomjsConstants.PREFERENCES_PAGE, "PhantomJS installation is not correctly configured.\n\n" + "Please goto Window -> Preferences -> "+PhantomjsConstants.PREFERENCE_PAGE_NAME +" and configure the correct location"); return; } cmdLine.add(phantomjsPath); if (isDebugMode) { int phantomjsDebugPort = preferenceStore.getInt(PreferenceConstants.PHANTOMJS_DEBUG_PORT); cmdLine.add("--remote-debugger-port="+phantomjsDebugPort); if (preferenceStore.getBoolean(PreferenceConstants.PHANTOMJS_DEBUG_AUTORUN)) //default false cmdLine.add("--remote-debugger-autorun=yes"); } String file = configuration.getAttribute("KEY_FILE_PATH", ""); String filePath = ResourcesPlugin.getWorkspace().getRoot().findMember(file).getLocation().toOSString(); // path is relative, so cannot find it, unless get absolute path cmdLine.add(filePath); File workingPath = null; String workingDirectory = configuration.getAttribute(Constants.ATTR_WORKING_DIRECTORY, ""); if(workingDirectory.length() > 0) { workingDirectory = VariablesUtil.resolveValue(workingDirectory); if(workingDirectory != null) { workingPath = new File(workingDirectory); } } if (workingPath == null){ workingPath = (new File(filePath)).getParentFile(); } Map<String, String> envm = new HashMap<String, String>(); envm = configuration.getAttribute(Constants.ATTR_ENVIRONMENT_VARIABLES, envm); String[] envp = new String[envm.size()]; int idx = 0; for(String key : envm.keySet()) { String value = envm.get(key); envp[idx++] = key + "=" + value; } for(String s : cmdLine) NodeclipseConsole.write(s+" "); NodeclipseConsole.write("\n"); String[] cmds = {}; cmds = cmdLine.toArray(cmds); // Launch a process to run or debug Process p = DebugPlugin.exec(cmds, workingPath, envp); RuntimeProcess process = (RuntimeProcess)DebugPlugin.newProcess(launch, p, PhantomjsConstants.PROCESS_MESSAGE); if (isDebugMode) { int phantomjsDebugPort = preferenceStore.getInt(PreferenceConstants.PHANTOMJS_DEBUG_PORT); NodeDebugUtil.launch(mode, launch, monitor, phantomjsDebugPort); } // if(!process.isTerminated()) { // NodeDebugUtil.launch(mode, launch, monitor); // } // } } }