/******************************************************************************* * Copyright (c) 2005, 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.console; import java.io.IOException; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.debug.core.DebugException; import org.eclipse.debug.core.ILaunch; import org.eclipse.debug.core.model.IProcess; import org.eclipse.dltk.console.ScriptConsoleServer; import org.eclipse.dltk.core.DLTKCore; import org.eclipse.dltk.core.environment.EnvironmentManager; import org.eclipse.dltk.core.environment.IDeployment; import org.eclipse.dltk.core.environment.IEnvironment; 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.execution.DeploymentManager; import org.eclipse.dltk.launching.IInterpreterInstall; import org.eclipse.dltk.launching.ScriptLaunchUtil; import org.eclipse.dltk.tcl.core.TclNature; import org.eclipse.dltk.tcl.launching.TclLaunchingPlugin; public class TclConsoleUtil { public static ILaunch runDefaultTclInterpreter(TclInterpreter interpreter) throws CoreException, IOException { final ConsoleDeployment deployment = deployConsoleScript(EnvironmentManager.getLocalEnvironment()); if (deployment == null) { return null; } final ILaunch launch = ScriptLaunchUtil.runScript(TclNature.NATURE_ID, deployment.scriptFile, null, null, constructConsoleArgs(interpreter), null); registerForCleanup(launch, deployment, interpreter); return launch; } /** * @since 1.1 */ public static ILaunch runTclInterpreter(IInterpreterInstall install, TclInterpreter interpreter) throws CoreException, IOException { final ConsoleDeployment deployment = deployConsoleScript(install.getEnvironment()); if (deployment == null) { return null; } final ILaunch launch = ScriptLaunchUtil.runScript(install, deployment.scriptFile, null, null, constructConsoleArgs(interpreter), null); registerForCleanup(launch, deployment, interpreter); return launch; } private static class ConsoleDeployment { final IFileHandle scriptFile; final IDeployment deployment; public ConsoleDeployment(IDeployment deployment, IFileHandle scriptFile) { this.deployment = deployment; this.scriptFile = scriptFile; } } private static ConsoleDeployment deployConsoleScript(IEnvironment environment) throws IOException { final IExecutionEnvironment exeEnv = environment.getAdapter(IExecutionEnvironment.class); final IDeployment deployment = exeEnv.createDeployment(); if (deployment == null) { return null; } final IPath path = deployment.add(TclLaunchingPlugin.getDefault().getBundle(), TclLaunchingPlugin.getDefault().getConsoleProxy()); return new ConsoleDeployment(deployment, deployment.getFile(path)); } private static String[] constructConsoleArgs(TclInterpreter interpreter) { ScriptConsoleServer server = ScriptConsoleServer.getInstance(); return new String[] { DLTKDebugPlugin.getDefault().getBindAddress(), Integer.toString(server.getPort()), server.register(interpreter) }; } private static void registerForCleanup(final ILaunch launch, final ConsoleDeployment deployment, TclInterpreter interpreter) { if (launch == null) { return; } DeploymentManager.getInstance().addDeployment(launch, deployment.deployment); interpreter.addCloseOperation(() -> { IProcess[] processes = launch.getProcesses(); if (processes != null) { for (int i = 0; i < processes.length; i++) { try { processes[i].terminate(); } catch (DebugException e) { if (DLTKCore.DEBUG) { e.printStackTrace(); } } } } }); } }