Compatibility fragment commit
[phpeclipse.git] / net.sourceforge.phpeclipse.32.compatibility / src / net / sourceforge / phpeclipse / xdebug / php / launching / PHPLaunchConfigurationDelegate.java
diff --git a/net.sourceforge.phpeclipse.32.compatibility/src/net/sourceforge/phpeclipse/xdebug/php/launching/PHPLaunchConfigurationDelegate.java b/net.sourceforge.phpeclipse.32.compatibility/src/net/sourceforge/phpeclipse/xdebug/php/launching/PHPLaunchConfigurationDelegate.java
new file mode 100644 (file)
index 0000000..5880ca0
--- /dev/null
@@ -0,0 +1,155 @@
+/**********************************************************************
+ Copyright (c) 2000, 2002 IBM Corp. and others.
+ All rights reserved. This program and the accompanying materials
+ are 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:
+ IBM Corporation - Initial implementation
+ Vicente Fernando - www.alfersoft.com.ar
+ **********************************************************************/
+package net.sourceforge.phpeclipse.xdebug.php.launching;
+
+import java.io.File;
+import java.text.MessageFormat;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import net.sourceforge.phpeclipse.xdebug.core.IXDebugPreferenceConstants;
+import net.sourceforge.phpeclipse.xdebug.core.XDebugCorePlugin;
+import net.sourceforge.phpeclipse.xdebug.php.model.XDebugTarget;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.debug.core.DebugPlugin;
+import org.eclipse.debug.core.ILaunch;
+import org.eclipse.debug.core.ILaunchConfiguration;
+import org.eclipse.debug.core.ILaunchManager;
+import org.eclipse.debug.core.model.IDebugTarget;
+import org.eclipse.debug.core.model.ILaunchConfigurationDelegate;
+import org.eclipse.debug.core.model.IProcess;
+import org.eclipse.debug.core.model.LaunchConfigurationDelegate;
+
+public class PHPLaunchConfigurationDelegate extends LaunchConfigurationDelegate {
+
+       /**
+        * @see ILaunchConfigurationDelegate#launch(ILaunchConfiguration, String,
+        *      ILaunch, IProgressMonitor)
+        */
+       public void launch(ILaunchConfiguration configuration, String mode,
+                       ILaunch launch, IProgressMonitor monitor) throws CoreException {
+               List commandList = new ArrayList();
+
+               String phpInterpreter = configuration.getAttribute(
+                               IXDebugConstants.ATTR_PHP_INTERPRETER, (String) null);
+               boolean useDefaultInterpreter = configuration.getAttribute(
+                               IXDebugConstants.ATTR_PHP_DEFAULT_INTERPRETER, true);
+
+               if (useDefaultInterpreter)
+                       phpInterpreter = XDebugCorePlugin
+                                       .getDefault()
+                                       .getPreferenceStore()
+                                       .getString(
+                                                       IXDebugPreferenceConstants.PHP_INTERPRETER_PREFERENCE);
+
+               File exe = new File(phpInterpreter);
+               // Just to get sure that the interpreter exists
+               if (!exe.exists()) {
+                       abort(
+                                       MessageFormat
+                                                       .format(
+                                                                       "Specified PHP executable {0} does not exist. Check value of PHP-Interpreter.",
+                                                                       new String[] { phpInterpreter }), null);
+               }
+               commandList.add(phpInterpreter);
+
+               // Project name
+               String projectName = configuration.getAttribute(
+                               IXDebugConstants.ATTR_PHP_PROJECT, (String) null);
+               IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(
+                               projectName);
+               // Just to get sure that the project exists
+               if (project == null) {
+                       abort("Project does not exist.", null);
+               }
+               String fileName = configuration.getAttribute(
+                               IXDebugConstants.ATTR_PHP_FILE, (String) null);
+
+               IFile file = project.getFile(fileName);
+               // Just to get sure that the script exists
+               if (!file.exists()) {
+                       abort(MessageFormat.format("PHP-Script {0} does not exist.",
+                                       new String[] { file.getFullPath().toString() }), null);
+               }
+
+               commandList.add(file.getLocation().toOSString());
+
+               // Get de Debugport form the Launchconfiguration or from the preferences
+               int debugPort = configuration.getAttribute(
+                               IXDebugConstants.ATTR_PHP_DEBUGPORT, -1);
+               boolean useDefaultPort = configuration.getAttribute(
+                               IXDebugConstants.ATTR_PHP_DEFAULT_DEBUGPORT, true);
+               if (useDefaultPort)
+                       debugPort = XDebugCorePlugin.getDefault().getPreferenceStore()
+                                       .getInt(IXDebugPreferenceConstants.DEBUGPORT_PREFERENCE);
+               if (debugPort < 1024)
+                       debugPort = IXDebugPreferenceConstants.DEFAULT_DEBUGPORT;
+
+               String[] envp = DebugPlugin.getDefault().getLaunchManager()
+                               .getEnvironment(configuration);
+               // appends the environment to the native environment
+               if (envp == null) {
+                       Map stringVars = DebugPlugin.getDefault().getLaunchManager()
+                                       .getNativeEnvironment();
+                       int idx = 0;
+                       envp = new String[stringVars.size()];
+                       for (Iterator i = stringVars.keySet().iterator(); i.hasNext();) {
+                               String key = (String) i.next();
+                               String value = (String) stringVars.get(key);
+                               envp[idx++] = key + "=" + value;
+                       }
+               }
+               if (mode.equals(ILaunchManager.DEBUG_MODE)) {
+                       String[] env = new String[envp.length + 1];
+                       for (int i = 0; i < envp.length; i++)
+                               env[i + 1] = envp[i];
+                       env[0] = "XDEBUG_CONFIG=idekey=xdebug_test remote_enable=1";
+                       envp = env;
+               }
+
+               String[] commandLine = (String[]) commandList
+                               .toArray(new String[commandList.size()]);
+               Process process = DebugPlugin.exec(commandLine, null, envp);
+               IProcess p = DebugPlugin.newProcess(launch, process, phpInterpreter);
+               if (mode.equals(ILaunchManager.DEBUG_MODE)) {
+                       IDebugTarget target = new XDebugTarget(launch, p, debugPort);
+                       launch.addDebugTarget(target);
+               }
+       }
+
+       /**
+        * Throws an exception with a new status containing the given message and
+        * optional exception.
+        * 
+        * @param message
+        *            error message
+        * @param e
+        *            underlying exception
+        * @throws CoreException
+        */
+       private void abort(String message, Throwable e) throws CoreException {
+               // TODO: the plug-in code should be the example plug-in, not Perl debug
+               // model id
+               throw new CoreException(new Status(IStatus.ERROR,
+                               IXDebugConstants.ID_PHP_DEBUG_MODEL, 0, message, e));
+       }
+
+}