X-Git-Url: http://git.phpeclipse.com diff --git a/net.sourceforge.phpeclipse.externaltools/src/net/sourceforge/phpdt/externaltools/internal/program/launchConfigurations/ProgramLaunchDelegate.java b/net.sourceforge.phpeclipse.externaltools/src/net/sourceforge/phpdt/externaltools/internal/program/launchConfigurations/ProgramLaunchDelegate.java new file mode 100644 index 0000000..7df974e --- /dev/null +++ b/net.sourceforge.phpeclipse.externaltools/src/net/sourceforge/phpdt/externaltools/internal/program/launchConfigurations/ProgramLaunchDelegate.java @@ -0,0 +1,138 @@ +package net.sourceforge.phpdt.externaltools.internal.program.launchConfigurations; + +/********************************************************************** +Copyright (c) 2002 IBM Corp. and others. All rights reserved. +This file is made available under the terms of the Common Public License v1.0 +which accompanies this distribution, and is available at +http://www.eclipse.org/legal/cpl-v10.html +  +Contributors: +**********************************************************************/ + +import java.io.File; + +import net.sourceforge.phpdt.externaltools.launchConfigurations.ExternalToolsUtil; +import net.sourceforge.phpdt.externaltools.variable.ExpandVariableContext; + +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IPath; +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.model.ILaunchConfigurationDelegate; +import org.eclipse.debug.core.model.IProcess; + +/** + * Launch delegate for a program. + */ +public class ProgramLaunchDelegate implements ILaunchConfigurationDelegate { + + /** + * Constructor for ProgramLaunchDelegate. + */ + public ProgramLaunchDelegate() { + super(); + } + + /** + * @see org.eclipse.debug.core.model.ILaunchConfigurationDelegate#launch(org.eclipse.debug.core.ILaunchConfiguration, java.lang.String, org.eclipse.debug.core.ILaunch, org.eclipse.core.runtime.IProgressMonitor) + */ + public void launch(ILaunchConfiguration configuration, String mode, ILaunch launch, IProgressMonitor monitor) throws CoreException { + + if (monitor.isCanceled()) { + return; + } + + // get variable context + ExpandVariableContext resourceContext = ExternalToolsUtil.getVariableContext(); + + if (monitor.isCanceled()) { + return; + } + + // resolve location + IPath location = ExternalToolsUtil.getLocation(configuration, resourceContext); + + if (monitor.isCanceled()) { + return; + } + + // resolve working directory + IPath workingDirectory = ExternalToolsUtil.getWorkingDirectory(configuration, resourceContext); + + if (monitor.isCanceled()) { + return; + } + + // resolve arguments + String[] arguments = ExternalToolsUtil.getArguments(configuration, resourceContext); + + if (monitor.isCanceled()) { + return; + } + + int cmdLineLength = 1; + if (arguments != null) { + cmdLineLength += arguments.length; + } + String[] cmdLine = new String[cmdLineLength]; + cmdLine[0] = location.toOSString(); + if (arguments != null) { + System.arraycopy(arguments, 0, cmdLine, 1, arguments.length); + } + + File workingDir = null; + if (workingDirectory != null) { + workingDir = workingDirectory.toFile(); + } + + if (monitor.isCanceled()) { + return; + } + + Process p = DebugPlugin.exec(cmdLine, workingDir); + IProcess process = null; + if (p != null) { + process = DebugPlugin.newProcess(launch, p, location.toOSString()); + } + process.setAttribute(IProcess.ATTR_CMDLINE, renderCommandLine(cmdLine)); + + if (ExternalToolsUtil.isBackground(configuration)) { + // refresh resources after process finishes + if (ExternalToolsUtil.getRefreshScope(configuration) != null) { + BackgroundResourceRefresher refresher = new BackgroundResourceRefresher(configuration, process, resourceContext); + refresher.startBackgroundRefresh(); + } + } else { + // wait for process to exit + while (!process.isTerminated()) { + try { + if (monitor.isCanceled()) { + process.terminate(); + break; + } + Thread.sleep(50); + } catch (InterruptedException e) { + } + } + + // refresh resources + ExternalToolsUtil.refreshResources(configuration, resourceContext, monitor); + } + + + } + + protected static String renderCommandLine(String[] commandLine) { + if (commandLine.length < 1) + return ""; //$NON-NLS-1$ + StringBuffer buf= new StringBuffer(commandLine[0]); + for (int i= 1; i < commandLine.length; i++) { + buf.append(' '); + buf.append(commandLine[i]); + } + return buf.toString(); + } + +}