| /******************************************************************************* |
| * Copyright (c) 2000, 2017 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 |
| * |
| *******************************************************************************/ |
| package org.eclipse.dltk.tcl.internal.launching; |
| |
| import java.io.IOException; |
| import java.util.ArrayList; |
| import java.util.List; |
| |
| import org.eclipse.core.runtime.CoreException; |
| import org.eclipse.core.runtime.IPath; |
| import org.eclipse.core.runtime.IStatus; |
| import org.eclipse.core.runtime.Path; |
| import org.eclipse.core.runtime.Status; |
| import org.eclipse.debug.core.ILaunch; |
| import org.eclipse.debug.core.ILaunchConfiguration; |
| import org.eclipse.debug.core.ILaunchManager; |
| import org.eclipse.dltk.console.ScriptConsoleServer; |
| import org.eclipse.dltk.core.DLTKCore; |
| import org.eclipse.dltk.core.environment.IDeployment; |
| import org.eclipse.dltk.core.environment.IExecutionEnvironment; |
| import org.eclipse.dltk.core.environment.IFileHandle; |
| import org.eclipse.dltk.debug.core.DLTKDebugPlugin; |
| import org.eclipse.dltk.internal.launching.EnvironmentResolver; |
| import org.eclipse.dltk.internal.launching.execution.DeploymentManager; |
| import org.eclipse.dltk.launching.AbstractInterpreterRunner; |
| import org.eclipse.dltk.launching.EnvironmentVariable; |
| import org.eclipse.dltk.launching.IInterpreterInstall; |
| import org.eclipse.dltk.launching.InterpreterConfig; |
| import org.eclipse.dltk.launching.ScriptLaunchConfigurationConstants; |
| import org.eclipse.dltk.tcl.core.TclLibpathUtils; |
| import org.eclipse.dltk.tcl.launching.TclLaunchConfigurationConstants; |
| import org.eclipse.dltk.tcl.launching.TclLaunchingPlugin; |
| |
| public class TclInterpreterRunner extends AbstractInterpreterRunner { |
| public TclInterpreterRunner(IInterpreterInstall install) { |
| super(install); |
| } |
| |
| @Override |
| protected String getProcessType() { |
| return TclLaunchConfigurationConstants.ID_TCL_PROCESS_TYPE; |
| } |
| |
| @Override |
| protected String[] getEnvironmentVariablesAsStrings(InterpreterConfig config) { |
| EnvironmentVariable[] vars = getInstall().getEnvironmentVariables(); |
| if (vars != null) { |
| String var = config.getEnvVar(TclLibpathUtils.TCLLIBPATH); |
| if (var != null) { |
| List<EnvironmentVariable> resultingVars = new ArrayList<>(); |
| for (EnvironmentVariable envVar : vars) { |
| if (envVar.getName().equals(TclLibpathUtils.TCLLIBPATH)) { |
| EnvironmentVariable[] variables = EnvironmentResolver.resolve(config.getEnvVars(), |
| new EnvironmentVariable[] { envVar }, true); |
| String newValue = var + " " |
| + TclLibpathUtils.convertToTclLibPathFormat(variables[0].getValue()); |
| config.addEnvVar(TclLibpathUtils.TCLLIBPATH, newValue); |
| } else { |
| resultingVars.add(envVar); |
| } |
| } |
| return config.getEnvironmentAsStringsIncluding( |
| resultingVars.toArray(new EnvironmentVariable[resultingVars.size()])); |
| } |
| } |
| return config.getEnvironmentAsStringsIncluding(vars); |
| } |
| |
| @Override |
| protected void alterConfig(ILaunch launch, InterpreterConfig config) { |
| super.alterConfig(launch, config); |
| if (!ILaunchManager.RUN_MODE.equals(launch.getLaunchMode())) { |
| return; |
| } |
| // use interactive console only in RUN mode. |
| ILaunchConfiguration configuration = launch.getLaunchConfiguration(); |
| if (configuration != null) { |
| boolean useTclConsole = false; |
| try { |
| useTclConsole = configuration |
| .getAttribute(ScriptLaunchConfigurationConstants.ATTR_USE_INTERACTIVE_CONSOLE, false); |
| } catch (CoreException e) { |
| if (DLTKCore.DEBUG) { |
| e.printStackTrace(); |
| } |
| } |
| if (useTclConsole) { |
| ScriptConsoleServer server = ScriptConsoleServer.getInstance(); |
| String port = Integer.toString(server.getPort()); |
| |
| try { |
| IExecutionEnvironment executionEnvironment = config.getExecutionEnvironment(); |
| IDeployment deployment = executionEnvironment.createDeployment(); |
| if (deployment == null) { |
| throw new CoreException(new Status(IStatus.ERROR, TclLaunchingPlugin.PLUGIN_ID, |
| "Could not establish connection with environment.")); |
| } |
| DeploymentManager.getInstance().addDeployment(launch, deployment); |
| IPath path = deployment.add(TclLaunchingPlugin.getDefault().getBundle(), |
| TclLaunchingPlugin.getDefault().getConsoleProxy()); |
| IFileHandle scriptFile = deployment.getFile(path); |
| |
| String id = configuration.getAttribute(ScriptLaunchConfigurationConstants.ATTR_DLTK_CONSOLE_ID, |
| (String) null); |
| config.addInterpreterArg(scriptFile.toOSString()); |
| config.addInterpreterArg(DLTKDebugPlugin.getDefault().getBindAddress()); |
| IPath scriptFilePath = config.getScriptFilePath(); |
| if (scriptFilePath == null) { |
| config.setScriptFile(new Path("--noscript")); |
| config.setNoFile(true); |
| } |
| config.addInterpreterArg(port); |
| if (id != null) { |
| config.addInterpreterArg(id); |
| } else { |
| throw new CoreException(new Status(IStatus.ERROR, TclLaunchingPlugin.PLUGIN_ID, |
| "Error to obtain console ID. Please update launch configuratin.")); |
| } |
| } catch (IOException e) { |
| if (DLTKCore.DEBUG) { |
| e.printStackTrace(); |
| } |
| } catch (CoreException e) { |
| if (DLTKCore.DEBUG) { |
| e.printStackTrace(); |
| } |
| } |
| } |
| } |
| } |
| } |