first version of external tools
[phpeclipse.git] / net.sourceforge.phpeclipse / src / net / sourceforge / phpdt / externaltools / internal / program / launchConfigurations / ProgramLaunchDelegate.java
diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/externaltools/internal/program/launchConfigurations/ProgramLaunchDelegate.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/externaltools/internal/program/launchConfigurations/ProgramLaunchDelegate.java
new file mode 100644 (file)
index 0000000..4ef2b1a
--- /dev/null
@@ -0,0 +1,137 @@
+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 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;
+import net.sourceforge.phpdt.externaltools.launchConfigurations.ExternalToolsUtil;
+import net.sourceforge.phpdt.externaltools.variable.ExpandVariableContext;
+
+/**
+ * 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();
+       }       
+       
+}