/**
* Copyright (c) 2013-2016 Angelo ZERR.
* 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:
* Angelo Zerr <angelo.zerr@gmail.com> - initial API and implementation
*/
package tern.eclipse.ide.server.nodejs.core.debugger.launchConfigurations;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.externaltools.internal.IExternalToolConstants;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.debug.core.ILaunchConfiguration;
import tern.TernException;
import tern.eclipse.ide.server.nodejs.core.debugger.INodejsDebugger;
import tern.server.nodejs.process.INodejsLaunchConfiguration;
import tern.server.nodejs.process.INodejsProcess;
/**
* Launcher executed with a client file (ex : lib/cli.js for protractor) with
* tern debugger {@link INodejsDebugger}.
*
*/
public abstract class AbstractNodejsCliFileLauncher implements INodejsLaunchConfiguration {
private final IFile configFile;
private final IFile cliFile;
private final INodejsDebugger debugger;
private final File nodeInstallPath;
private final String mode;
public AbstractNodejsCliFileLauncher(IFile configFile, IFile cliFile, INodejsDebugger debugger,
File nodeInstallPath, String mode) {
this.configFile = configFile;
this.cliFile = cliFile;
this.debugger = debugger;
this.nodeInstallPath = nodeInstallPath;
this.mode = mode;
}
public AbstractNodejsCliFileLauncher(ILaunchConfiguration configuration, String mode)
throws CoreException, NodejsCliFileConfigException {
this(getConfigFile(configuration), getCliFile(configuration), getDebugger(configuration),
getNodeInstallPath(configuration), mode);
}
private static IFile getConfigFile(ILaunchConfiguration configuration)
throws NodejsCliFileConfigException, CoreException {
String param = configuration.getAttribute(IExternalToolConstants.ATTR_LOCATION, (String) null);
return NodejsCliFileHelper.getConfigFile(param);
}
private static IFile getCliFile(ILaunchConfiguration configuration)
throws NodejsCliFileConfigException, CoreException {
String param = configuration.getAttribute(INodejsCliFileLaunchConfigurationConstants.ATTR_CLI_FILE,
(String) null);
return NodejsCliFileHelper.getCliFile(param);
}
private static File getNodeInstallPath(ILaunchConfiguration configuration)
throws NodejsCliFileConfigException, CoreException {
String nodeInstall = configuration.getAttribute(INodejsCliFileLaunchConfigurationConstants.ATTR_NODE_INSTALL,
(String) null);
String nodePath = configuration.getAttribute(INodejsCliFileLaunchConfigurationConstants.ATTR_NODE_PATH,
(String) null);
return NodejsCliFileHelper.getNodeInstallPath(nodeInstall, nodePath);
}
private static INodejsDebugger getDebugger(ILaunchConfiguration configuration)
throws CoreException, NodejsCliFileConfigException {
String debuggerId = configuration.getAttribute(INodejsCliFileLaunchConfigurationConstants.ATTR_DEBUGGER,
(String) null);
return NodejsCliFileHelper.getDebugger(debuggerId);
}
public void start() throws TernException {
INodejsProcess process = debugger.createProcess(cliFile, configFile.getProject().getLocation().toFile(), nodeInstallPath);
process.setLaunchConfiguration(this);
process.start();
}
@Override
public List<String> createNodeArgs() {
List<String> args = new ArrayList<String>();
// here we need to generate file system path because Webclispe cannot
// support
// program args like ${workspace_loc:\test-protractor\spec.js}
args.add(configFile.getLocation().toOSString());
// Uncomment that once Webclipse can support it.
// args.add(VariableHelper.getWorkspaceLoc(protractorConfigFile));
return args;
}
@Override
public String getLaunchMode() {
return mode;
}
@Override
public boolean isSaveLaunch() {
return false;
}
@Override
public boolean isWaitOnPort() {
return false;
}
public IFile getConfigFile() {
return configFile;
}
}