From a7b1621f8e7808c1b293d1b4d2e6b434e3e2beaa Mon Sep 17 00:00:00 2001
From: khartlage <khartlage>
Date: Sun, 29 Dec 2002 18:56:33 +0000
Subject: [PATCH 1/1] This commit was generated by cvs2svn to compensate for changes in r59,
 which included commits to RCS files with non-trunk default branches.

---
 net.sourceforge.phpeclipse.launching/.classpath    |   18 ++
 net.sourceforge.phpeclipse.launching/.project      |   29 ++++
 net.sourceforge.phpeclipse.launching/.template     |    4 +
 .../build.properties                               |    1 +
 net.sourceforge.phpeclipse.launching/build.xml     |  115 +++++++++++++
 .../plugin.properties                              |    3 +
 net.sourceforge.phpeclipse.launching/plugin.xml    |   47 ++++++
 .../internal/launching/InterpreterRunner.java      |   90 ++++++++++
 .../launching/InterpreterRunnerConfiguration.java  |   86 ++++++++++
 .../phpdt/internal/launching/PHPInterpreter.java   |   60 +++++++
 .../launching/PHPLaunchConfigurationAttribute.java |   18 ++
 .../launching/PHPLaunchConfigurationDelegate.java  |   34 ++++
 .../internal/launching/PHPLaunchingMessages.java   |   21 +++
 .../launching/PHPLaunchingMessages.properties      |    6 +
 .../internal/launching/PHPLaunchingPlugin.java     |   35 ++++
 .../phpdt/internal/launching/PHPRuntime.java       |  174 ++++++++++++++++++++
 16 files changed, 741 insertions(+), 0 deletions(-)
 create mode 100644 net.sourceforge.phpeclipse.launching/.classpath
 create mode 100644 net.sourceforge.phpeclipse.launching/.project
 create mode 100644 net.sourceforge.phpeclipse.launching/.template
 create mode 100644 net.sourceforge.phpeclipse.launching/build.properties
 create mode 100644 net.sourceforge.phpeclipse.launching/build.xml
 create mode 100644 net.sourceforge.phpeclipse.launching/plugin.properties
 create mode 100644 net.sourceforge.phpeclipse.launching/plugin.xml
 create mode 100644 net.sourceforge.phpeclipse.launching/src/net/sourceforge/phpdt/internal/launching/InterpreterRunner.java
 create mode 100644 net.sourceforge.phpeclipse.launching/src/net/sourceforge/phpdt/internal/launching/InterpreterRunnerConfiguration.java
 create mode 100644 net.sourceforge.phpeclipse.launching/src/net/sourceforge/phpdt/internal/launching/PHPInterpreter.java
 create mode 100644 net.sourceforge.phpeclipse.launching/src/net/sourceforge/phpdt/internal/launching/PHPLaunchConfigurationAttribute.java
 create mode 100644 net.sourceforge.phpeclipse.launching/src/net/sourceforge/phpdt/internal/launching/PHPLaunchConfigurationDelegate.java
 create mode 100644 net.sourceforge.phpeclipse.launching/src/net/sourceforge/phpdt/internal/launching/PHPLaunchingMessages.java
 create mode 100644 net.sourceforge.phpeclipse.launching/src/net/sourceforge/phpdt/internal/launching/PHPLaunchingMessages.properties
 create mode 100644 net.sourceforge.phpeclipse.launching/src/net/sourceforge/phpdt/internal/launching/PHPLaunchingPlugin.java
 create mode 100644 net.sourceforge.phpeclipse.launching/src/net/sourceforge/phpdt/internal/launching/PHPRuntime.java

diff --git a/net.sourceforge.phpeclipse.launching/.classpath b/net.sourceforge.phpeclipse.launching/.classpath
new file mode 100644
index 0000000..40e8710
--- /dev/null
+++ b/net.sourceforge.phpeclipse.launching/.classpath
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+    <classpathentry kind="src" path="src"/>
+    <classpathentry exported="true" kind="src" path="/net.sourceforge.phpeclipse"/>
+    <classpathentry kind="var" path="JRE_LIB" rootpath="JRE_SRCROOT" sourcepath="JRE_SRC"/>
+    <classpathentry kind="lib"
+        path="C:/eclipse/plugins/org.eclipse.debug.core_2.0.0/dtcore.jar"
+        rootpath="" sourcepath="C:/eclipse/plugins/org.eclipse.platform.source_2.0.0/src/org.eclipse.debug.core_2.0.0/dtcoresrc.zip"/>
+    <classpathentry kind="lib" path="C:/eclipse/plugins/org.junit_3.7.0/junit.jar"/>
+    <classpathentry kind="lib" path="C:/eclipse/plugins/org.apache.xerces_4.0.3/xmlParserAPIs.jar"/>
+    <classpathentry kind="lib" path="C:/eclipse/plugins/org.apache.xerces_4.0.3/xercesImpl.jar"/>
+    <classpathentry kind="lib" path="C:/eclipse/plugins/org.eclipse.core.boot_2.0.0/boot.jar"/>
+    <classpathentry kind="lib" path="C:/eclipse/plugins/org.eclipse.core.resources_2.0.0/resources.jar"/>
+    <classpathentry kind="lib" path="C:/eclipse/plugins/org.eclipse.core.runtime_2.0.0/runtime.jar"/>
+    <classpathentry kind="lib"
+        path="C:/eclipse/plugins/org.eclipse.ui_2.0.0/workbench.jar" sourcepath="C:/eclipse/plugins/org.eclipse.platform.source_2.0.0/src/org.eclipse.ui_2.0.0/workbenchsrc.zip"/>
+    <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/net.sourceforge.phpeclipse.launching/.project b/net.sourceforge.phpeclipse.launching/.project
new file mode 100644
index 0000000..6472dbe
--- /dev/null
+++ b/net.sourceforge.phpeclipse.launching/.project
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>net.sourceforge.phpeclipse.launching</name>
+	<comment></comment>
+	<projects>
+		<project>net.sourceforge.phpeclipse</project>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+		<nature>org.eclipse.pde.PluginNature</nature>
+	</natures>
+</projectDescription>
diff --git a/net.sourceforge.phpeclipse.launching/.template b/net.sourceforge.phpeclipse.launching/.template
new file mode 100644
index 0000000..d65e0f4
--- /dev/null
+++ b/net.sourceforge.phpeclipse.launching/.template
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<form>
+   <p/><p><b>Tips on working with this plug-in project</b></p><li>For the view of the new plug-in at a glance, go to the <img href="pageImage"/><a href="OverviewPage">Overview</a>.</li><li>You can test the contributions of this plug-in by launching another instance of the workbench. On the <b>Run</b> menu, click <b>Run As</b> and choose <img href="runTimeWorkbenchImage"/><a href="action.run">Run-time Workbench</a> from the available choices.</li><li>You can add more functionality to this plug-in by adding extensions using the <a href="action.newExtension">New Extension Wizard</a>.</li><li>The plug-in project contains Java code that you can debug. Place breakpoints in Java classes. On the <b>Run</b> menu, select <b>Debug As</b> and choose <img href="runTimeWorkbenchImage"/><a href="action.debug">Run-time Workbench</a> from the available choices.</li>
+</form>
diff --git a/net.sourceforge.phpeclipse.launching/build.properties b/net.sourceforge.phpeclipse.launching/build.properties
new file mode 100644
index 0000000..c95a801
--- /dev/null
+++ b/net.sourceforge.phpeclipse.launching/build.properties
@@ -0,0 +1 @@
+source.launch.jar = src/
diff --git a/net.sourceforge.phpeclipse.launching/build.xml b/net.sourceforge.phpeclipse.launching/build.xml
new file mode 100644
index 0000000..53bb0b1
--- /dev/null
+++ b/net.sourceforge.phpeclipse.launching/build.xml
@@ -0,0 +1,115 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="net.sourceforge.phpeclipse.launching" default="build.jars" basedir=".">
+
+	<property name="bootclasspath" value=""/>
+	<property name="ws" value="win32"/>
+	<property name="os" value="win32"/>
+	<property name="arch" value="x86"/>
+
+	<target name="init" depends="properties">
+		<property name="plugin" value="net.sourceforge.phpeclipse.launching"/>
+		<property name="version.suffix" value="_1.0.3"/>
+		<property name="full.name" value="${plugin}${version.suffix}"/>
+		<property name="temp.folder" value="${basedir}/temp.folder"/>
+		<property name="plugin.destination" value="${basedir}"/>
+		<property name="build.result.folder" value="${basedir}"/>
+	</target>
+
+	<target name="properties" if="eclipse.running">
+		<property name="build.compiler" value="org.eclipse.jdt.core.JDTCompilerAdapter"/>
+	</target>
+
+	<target name="build.update.jar" depends="init">
+		<delete dir="${temp.folder}"/>
+		<mkdir dir="${temp.folder}"/>
+		<antcall target="build.jars"/>
+		<antcall target="gather.bin.parts">
+			<param name="destination.temp.folder" value="${temp.folder}/"/>
+		</antcall>
+		<zip zipfile="${plugin.destination}/${full.name}.jar" basedir="${temp.folder}/${full.name}" filesonly="false"/>
+		<delete dir="${temp.folder}"/>
+	</target>
+
+	<target name="gather.bin.parts" depends="init" if="destination.temp.folder">
+		<mkdir dir="${destination.temp.folder}/${full.name}"/>
+		<copy file="${build.result.folder}/launch.jar" todir="${destination.temp.folder}/${full.name}"/>
+	</target>
+
+	<target name="launch.jar" depends="init" unless="launch.jar">
+		<property name="destdir" value="${temp.folder}/launch.jar.bin"/>
+		<delete dir="${temp.folder}/launch.jar.bin"/>
+		<mkdir dir="${temp.folder}/launch.jar.bin"/>
+		<!-- compile the source code -->
+		<javac destdir="${temp.folder}/launch.jar.bin" failonerror="false" verbose="true" debug="on" includeAntRuntime="no" bootclasspath="${bootclasspath}" classpath="../../plugins/org.eclipse.core.resources.win32_2.0.0/resources.jar;../../plugins/org.apache.xerces_4.0.3/xmlParserAPIs.jar;../net.sourceforge.phpeclipse/phpeclipse.jar;../../plugins/org.eclipse.debug.core_2.0.0/dtcore.jar;../../plugins/org.eclipse.swt_2.0.0/ws/${ws}/swt.jar;../../plugins/org.apache.xerces_4.0.3/xercesImpl.jar;../../plugins/org.junit_3.7.0/bin;../../plugins/org.eclipse.core.boot_2.0.0/bin;../../plugins/org.eclipse.core.runtime_2.0.0/runtime.jar;../../plugins/org.eclipse.core.boot_2.0.0/boot.jar;../../plugins/org.eclipse.ui.win32_2.0.0/workbench.jar;../net.sourceforge.phpeclipse/bin;../../plugins/org.apache.xerces_4.0.3/bin;../../plugins/org.eclipse.debug.core_2.0.0/bin;../../plugins/org.eclipse.swt_2.0.0/bin;../../plugins/org.eclipse.core.resources_2.0.0/bin;../../plugins/org.eclipse.core.resources_2.0.0/resources.jar;../../plugins/org.eclipse.swt.win32_2.0.0/ws/${ws}/swt.jar;../../plugins/org.eclipse.ui_2.0.0/workbench.jar;../../plugins/org.eclipse.core.runtime_2.0.0/bin;../../plugins/org.junit_3.7.0/junit.jar;../../plugins/org.eclipse.ui_2.0.0/bin;../../plugins/org.eclipse.ui.win32_2.0.0/workbenchwin32.jar">
+			<src path="src/"/>
+		</javac>
+		<!-- copy necessary resources -->
+		<copy todir="${temp.folder}/launch.jar.bin">
+			<fileset dir="src/" excludes="**/*.java"/>
+		</copy>
+		<mkdir dir="${build.result.folder}"/>
+		<jar jarfile="${build.result.folder}/launch.jar" basedir="${temp.folder}/launch.jar.bin"/>
+		<delete dir="${temp.folder}/launch.jar.bin"/>
+	</target>
+
+	<target name="launchsrc.zip" depends="init" unless="launchsrc.zip">
+		<mkdir dir="${build.result.folder}"/>
+		<zip zipfile="${build.result.folder}/launchsrc.zip" filesonly="false">
+			<fileset dir="src/" includes="**/*.java"/>
+		</zip>
+	</target>
+
+	<target name="build.jars" depends="init">
+		<available property="launch.jar" file="${build.result.folder}/launch.jar"/>
+		<antcall target="launch.jar"/>
+	</target>
+
+	<target name="build.sources" depends="init">
+		<available property="launchsrc.zip" file="${build.result.folder}/launchsrc.zip"/>
+		<antcall target="launchsrc.zip"/>
+	</target>
+
+	<target name="build.zips" depends="init">
+	</target>
+
+	<target name="gather.sources" depends="init" if="destination.temp.folder">
+		<mkdir dir="${destination.temp.folder}/${full.name}"/>
+		<copy file="${build.result.folder}/launchsrc.zip" todir="${destination.temp.folder}/${full.name}"/>
+	</target>
+
+	<target name="gather.logs" depends="init" if="destination.temp.folder">
+		<mkdir dir="${destination.temp.folder}/${full.name}"/>
+		<copy file="${temp.folder}/launch.jar.bin.log" todir="${destination.temp.folder}/${full.name}"/>
+	</target>
+
+	<target name="clean" depends="init">
+		<delete file="${build.result.folder}/launch.jar"/>
+		<delete file="${build.result.folder}/launchsrc.zip"/>
+		<delete file="${plugin.destination}/${full.name}.jar"/>
+		<delete file="${plugin.destination}/${full.name}.zip"/>
+		<delete dir="${temp.folder}"/>
+	</target>
+
+	<target name="refresh" depends="init" if="eclipse.running">
+		<eclipse.refreshLocal resource="${plugin}" depth="infinite"/>
+	</target>
+
+	<target name="zip.plugin" depends="init">
+		<delete dir="${temp.folder}"/>
+		<mkdir dir="${temp.folder}"/>
+		<antcall target="build.jars"/>
+		<antcall target="build.sources"/>
+		<antcall target="gather.bin.parts">
+			<param name="destination.temp.folder" value="${temp.folder}/"/>
+		</antcall>
+		<antcall target="gather.sources">
+			<param name="destination.temp.folder" value="${temp.folder}/"/>
+		</antcall>
+		<delete>
+			<fileset dir="${temp.folder}" includes="**/*.bin.log"/>
+		</delete>
+		<zip zipfile="${plugin.destination}/${full.name}.zip" basedir="${temp.folder}" filesonly="true"/>
+		<delete dir="${temp.folder}"/>
+	</target>
+
+</project>
diff --git a/net.sourceforge.phpeclipse.launching/plugin.properties b/net.sourceforge.phpeclipse.launching/plugin.properties
new file mode 100644
index 0000000..973f149
--- /dev/null
+++ b/net.sourceforge.phpeclipse.launching/plugin.properties
@@ -0,0 +1,3 @@
+
+Plugin.name=PHPEclipse Launching Support
+LaunchConfigurationTypePHPApplication.name=PHP Application
\ No newline at end of file
diff --git a/net.sourceforge.phpeclipse.launching/plugin.xml b/net.sourceforge.phpeclipse.launching/plugin.xml
new file mode 100644
index 0000000..2f39512
--- /dev/null
+++ b/net.sourceforge.phpeclipse.launching/plugin.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<plugin
+   id="net.sourceforge.phpeclipse.launching"
+   name="%Plugin.name"
+   version="1.0.3"
+   provider-name="eclipseproject.de"
+   class="net.sourceforge.phpdt.internal.launching.PHPLaunchingPlugin">
+
+   <runtime>
+      <library name="launch.jar">
+         <export name="*"/>
+      </library>
+   </runtime>
+   <requires>
+      <import plugin="org.eclipse.core.runtime"/>
+      <import plugin="org.eclipse.core.resources"/>
+      <import plugin="org.eclipse.ui"/>
+      <import plugin="org.eclipse.debug.core"/>
+      <import plugin="org.junit"/>
+      <import plugin="org.apache.xerces"/>
+      <import plugin="net.sourceforge.phpeclipse"/>
+   </requires>
+
+
+   <extension
+         point="org.eclipse.debug.core.launchConfigurationTypes">
+      <launchConfigurationType
+            name="%LaunchConfigurationTypePHPApplication.name"
+            delegate="net.sourceforge.phpdt.internal.launching.PHPLaunchConfigurationDelegate"
+            modes="run"
+            id="net.sourceforge.phpdt.launching.LaunchConfigurationTypePHPApplication">
+         <fileExtension
+               default="true"
+               extension="php">
+         </fileExtension>
+         <fileExtension
+               default="true"
+               extension="php3">
+         </fileExtension>
+         <fileExtension 
+               default="true"
+               extension="php4">
+         </fileExtension>
+      </launchConfigurationType>
+   </extension>
+
+</plugin>
\ No newline at end of file
diff --git a/net.sourceforge.phpeclipse.launching/src/net/sourceforge/phpdt/internal/launching/InterpreterRunner.java b/net.sourceforge.phpeclipse.launching/src/net/sourceforge/phpdt/internal/launching/InterpreterRunner.java
new file mode 100644
index 0000000..5e76ed5
--- /dev/null
+++ b/net.sourceforge.phpeclipse.launching/src/net/sourceforge/phpdt/internal/launching/InterpreterRunner.java
@@ -0,0 +1,90 @@
+package net.sourceforge.phpdt.internal.launching;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Iterator;
+
+import net.sourceforge.phpeclipse.resourcesview.PHPProject;
+import org.eclipse.core.boot.BootLoader;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.debug.core.DebugPlugin;
+import org.eclipse.debug.core.ILaunch;
+import org.eclipse.debug.core.model.IProcess;
+
+public class InterpreterRunner {
+
+	public InterpreterRunner() {
+	}
+
+	public IProcess run(InterpreterRunnerConfiguration configuration, ILaunch launch) {
+		String commandLine = renderCommandLine(configuration);
+		File workingDirectory = configuration.getAbsoluteWorkingDirectory();
+
+		Process nativePHPProcess = null;
+		try {
+			nativePHPProcess = configuration.getInterpreter().exec(commandLine, workingDirectory);
+		} catch (IOException e) {
+			throw new RuntimeException("Unable to execute interpreter: " + commandLine + workingDirectory);
+		}
+
+		IProcess process = DebugPlugin.getDefault().newProcess(launch, nativePHPProcess, renderLabel(configuration));
+		process.setAttribute(PHPLaunchingPlugin.PLUGIN_ID + ".launcher.cmdline", commandLine);
+		return process ;
+	}
+
+	protected String renderLabel(InterpreterRunnerConfiguration configuration) {
+		StringBuffer buffer = new StringBuffer();
+
+		PHPInterpreter interpreter = configuration.getInterpreter();
+		buffer.append("PHP ");
+		buffer.append(interpreter.getCommand());
+		buffer.append(" : ");
+		buffer.append(configuration.getFileName());
+
+		return buffer.toString();
+	}
+
+	protected String renderCommandLine(InterpreterRunnerConfiguration configuration) {
+		PHPInterpreter interpreter = configuration.getInterpreter();
+
+		StringBuffer buffer = new StringBuffer();
+		buffer.append(this.getDebugCommandLineArgument());
+	//	buffer.append(renderLoadPath(configuration));
+		buffer.append(" " + configuration.getInterpreterArguments());
+	//	buffer.append(interpreter.endOfOptionsDelimeter);
+		buffer.append(" " + osDependentPath(configuration.getAbsoluteFileName()));
+		buffer.append(" " + configuration.getProgramArguments());
+
+		return buffer.toString();
+	}
+
+//	protected String renderLoadPath(InterpreterRunnerConfiguration configuration) {
+//		StringBuffer loadPath = new StringBuffer();
+//
+//		PHPProject project = configuration.getProject();
+//		addToLoadPath(loadPath, project.getProject());
+//
+//		Iterator referencedProjects = project.getReferencedProjects().iterator();
+//		while (referencedProjects.hasNext())
+//			addToLoadPath(loadPath, (IProject) referencedProjects.next());
+//
+//		return loadPath.toString();
+//	}
+
+//	protected void addToLoadPath(StringBuffer loadPath, IProject project) {
+//
+//		loadPath.append(" -I " + osDependentPath(project.getLocation().toOSString()));
+//	}
+
+	protected String osDependentPath(String aPath) {
+		if (BootLoader.getOS().equals(BootLoader.OS_WIN32))
+			aPath = "\"" + aPath + "\"";
+
+		return aPath;
+	}
+	
+	protected String getDebugCommandLineArgument() {
+		return "" ;	
+	}
+	
+}
diff --git a/net.sourceforge.phpeclipse.launching/src/net/sourceforge/phpdt/internal/launching/InterpreterRunnerConfiguration.java b/net.sourceforge.phpeclipse.launching/src/net/sourceforge/phpdt/internal/launching/InterpreterRunnerConfiguration.java
new file mode 100644
index 0000000..5af6d02
--- /dev/null
+++ b/net.sourceforge.phpeclipse.launching/src/net/sourceforge/phpdt/internal/launching/InterpreterRunnerConfiguration.java
@@ -0,0 +1,86 @@
+package net.sourceforge.phpdt.internal.launching;
+
+import java.io.File;
+
+import net.sourceforge.phpeclipse.resourcesview.PHPProject;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.debug.core.ILaunchConfiguration;
+
+public class InterpreterRunnerConfiguration {
+	protected ILaunchConfiguration configuration;
+
+	public InterpreterRunnerConfiguration(ILaunchConfiguration aConfiguration) {
+		configuration = aConfiguration;
+	}
+	
+	public String getAbsoluteFileName() {
+		IPath path = new Path(getFileName());
+		IProject project = getProject().getProject();
+
+		return project.getLocation().toOSString() + "/" + getFileName();
+	}
+	
+	public String getFileName() {
+		String fileName = "";
+
+		try {
+			fileName = configuration.getAttribute(PHPLaunchConfigurationAttribute.FILE_NAME, "No file specified in configuration");
+		} catch(CoreException e) {}
+		
+		return fileName.replace('\\', '/');
+	}
+	
+	public PHPProject getProject() {
+		String projectName = "";
+		
+		try {
+			projectName = configuration.getAttribute(PHPLaunchConfigurationAttribute.PROJECT_NAME, "");
+		} catch(CoreException e) {
+			PHPLaunchingPlugin.getDefault().log(e);
+		}
+
+		IProject project = PHPLaunchingPlugin.getWorkspace().getRoot().getProject(projectName);
+
+		PHPProject phpProject = new PHPProject();
+		phpProject.setProject(project);
+		return phpProject;
+	}
+	
+	public File getAbsoluteWorkingDirectory() {
+		String file = null;
+		try {
+			file = configuration.getAttribute(PHPLaunchConfigurationAttribute.WORKING_DIRECTORY, "");
+		} catch(CoreException e) {
+			PHPLaunchingPlugin.log(e);
+		}
+		return new File(file);
+	}
+	
+	public String getInterpreterArguments() {
+		try {
+			return configuration.getAttribute(PHPLaunchConfigurationAttribute.INTERPRETER_ARGUMENTS, "");
+		} catch(CoreException e) {}
+		
+		return "";
+	}
+	
+	public String getProgramArguments() {
+		try {
+			return configuration.getAttribute(PHPLaunchConfigurationAttribute.PROGRAM_ARGUMENTS, "");
+		} catch (CoreException e) {}
+		
+		return "";
+	}
+
+	public PHPInterpreter getInterpreter() {
+		String selectedInterpreter = null;
+		try {
+			selectedInterpreter = configuration.getAttribute(PHPLaunchConfigurationAttribute.SELECTED_INTERPRETER, "");
+		} catch(CoreException e) {}
+		
+		return PHPRuntime.getDefault().getInterpreter(selectedInterpreter);
+	}
+}
diff --git a/net.sourceforge.phpeclipse.launching/src/net/sourceforge/phpdt/internal/launching/PHPInterpreter.java b/net.sourceforge.phpeclipse.launching/src/net/sourceforge/phpdt/internal/launching/PHPInterpreter.java
new file mode 100644
index 0000000..2e342b9
--- /dev/null
+++ b/net.sourceforge.phpeclipse.launching/src/net/sourceforge/phpdt/internal/launching/PHPInterpreter.java
@@ -0,0 +1,60 @@
+package net.sourceforge.phpdt.internal.launching;
+
+import java.io.File;
+import java.io.IOException;
+
+import org.eclipse.core.internal.resources.OS;
+import org.eclipse.core.runtime.IPath;
+
+public class PHPInterpreter {
+	//public final String endOfOptionsDelimeter = " -- ";
+
+	protected IPath installLocation;
+	protected String name;
+
+	public PHPInterpreter(String aName, IPath validInstallLocation) {
+		name = aName;
+		installLocation = validInstallLocation;
+	}
+
+	public IPath getInstallLocation() {
+		return installLocation;
+	}
+
+	public void setInstallLocation(IPath validInstallLocation) {
+		installLocation = validInstallLocation;
+	}
+	
+	public String getName() {
+		return name;
+	}
+	
+	public void setName(String newName) {
+		name = newName;
+	}
+	
+	public String getCommand() {
+		String directory = installLocation.toOSString() + File.separator;
+		if (new File(directory + "php.exe").isFile())
+			return directory + "php.exe";
+
+		if (new File(directory, "php").isFile())
+			return directory + "php";
+			
+		return null;
+	}
+	
+	public Process exec(String arguments, File workingDirectory) throws IOException {
+		return Runtime.getRuntime().exec(this.getCommand() + " " +  arguments, null, workingDirectory);
+	}
+	
+	public boolean equals(Object other) {
+		if (other instanceof PHPInterpreter) {
+			PHPInterpreter otherInterpreter = (PHPInterpreter) other;
+			if (name.equals(otherInterpreter.getName()))
+				return installLocation.equals(otherInterpreter.getInstallLocation());
+		}
+		
+		return false;
+	}
+}
diff --git a/net.sourceforge.phpeclipse.launching/src/net/sourceforge/phpdt/internal/launching/PHPLaunchConfigurationAttribute.java b/net.sourceforge.phpeclipse.launching/src/net/sourceforge/phpdt/internal/launching/PHPLaunchConfigurationAttribute.java
new file mode 100644
index 0000000..d6b853e
--- /dev/null
+++ b/net.sourceforge.phpeclipse.launching/src/net/sourceforge/phpdt/internal/launching/PHPLaunchConfigurationAttribute.java
@@ -0,0 +1,18 @@
+package net.sourceforge.phpdt.internal.launching;
+
+
+
+public interface PHPLaunchConfigurationAttribute {
+	static final String PHP_LAUNCH_CONFIGURATION_TYPE = "net.sourceforge.phpdt.launching.LaunchConfigurationTypePHPApplication";
+
+	static final String CUSTOM_LOAD_PATH = PHPLaunchingPlugin.PLUGIN_ID + ".CUSTOM_LOAD_PATH";
+	static final String FILE_NAME = PHPLaunchingPlugin.PLUGIN_ID + ".FILE_NAME";
+	static final String INTERPRETER_ARGUMENTS = PHPLaunchingPlugin.PLUGIN_ID + ".INTERPRETER_ARGUMENTS";
+	static final String MODULE_NAME = PHPLaunchingPlugin.PLUGIN_ID + ".MODULE_NAME";
+	static final String PROGRAM_ARGUMENTS = PHPLaunchingPlugin.PLUGIN_ID + ".PROGRAM_ARGUMENTS";
+	static final String PROJECT_NAME = PHPLaunchingPlugin.PLUGIN_ID + ".PROJECT_NAME";
+	static final String SELECTED_INTERPRETER = PHPLaunchingPlugin.PLUGIN_ID + ".SELECTED_INTERPRETER";
+	static final String WORKING_DIRECTORY = PHPLaunchingPlugin.PLUGIN_ID + ".WORKING_DIRECTORY";
+	static final String USE_DEFAULT_LOAD_PATH = PHPLaunchingPlugin.PLUGIN_ID + ".USE_DEFAULT_LOAD_PATH";
+	static final String USE_DEFAULT_WORKING_DIRECTORY = PHPLaunchingPlugin.PLUGIN_ID + ".USE_DEFAULT_WORKING_DIRECTORY";
+}
\ No newline at end of file
diff --git a/net.sourceforge.phpeclipse.launching/src/net/sourceforge/phpdt/internal/launching/PHPLaunchConfigurationDelegate.java b/net.sourceforge.phpeclipse.launching/src/net/sourceforge/phpdt/internal/launching/PHPLaunchConfigurationDelegate.java
new file mode 100644
index 0000000..bbc6a9e
--- /dev/null
+++ b/net.sourceforge.phpeclipse.launching/src/net/sourceforge/phpdt/internal/launching/PHPLaunchConfigurationDelegate.java
@@ -0,0 +1,34 @@
+package net.sourceforge.phpdt.internal.launching;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+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.ILaunch;
+import org.eclipse.debug.core.ILaunchConfiguration;
+import org.eclipse.debug.core.model.ILaunchConfigurationDelegate;
+
+
+public class PHPLaunchConfigurationDelegate implements ILaunchConfigurationDelegate {
+	protected static final InterpreterRunner interpreterRunner = new InterpreterRunner();
+//	protected static final DebuggerRunner debuggerRunner = new DebuggerRunner();
+
+	public PHPLaunchConfigurationDelegate() {
+		super();
+	}
+
+	/**
+	 * @see ILaunchConfigurationDelegate#launch(ILaunchConfiguration, String, ILaunch, IProgressMonitor)
+	 */
+	public void launch(ILaunchConfiguration configuration, String mode, ILaunch launch, IProgressMonitor monitor) throws CoreException {
+		if (PHPRuntime.getDefault().getSelectedInterpreter() == null)
+			throw new CoreException(new Status(IStatus.ERROR, PHPLaunchingPlugin.PLUGIN_ID, IStatus.OK, "You must define an interpreter before running PHP.", null));
+//		if (mode.equals("debug")) {
+//			debuggerRunner.run(new InterpreterRunnerConfiguration(configuration), launch);
+//		} else {
+			interpreterRunner.run(new InterpreterRunnerConfiguration(configuration), launch);
+//		}		
+	}
+}
diff --git a/net.sourceforge.phpeclipse.launching/src/net/sourceforge/phpdt/internal/launching/PHPLaunchingMessages.java b/net.sourceforge.phpeclipse.launching/src/net/sourceforge/phpdt/internal/launching/PHPLaunchingMessages.java
new file mode 100644
index 0000000..ca7ed89
--- /dev/null
+++ b/net.sourceforge.phpeclipse.launching/src/net/sourceforge/phpdt/internal/launching/PHPLaunchingMessages.java
@@ -0,0 +1,21 @@
+package net.sourceforge.phpdt.internal.launching;
+
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+public class PHPLaunchingMessages {
+
+	private static final String BUNDLE_NAME = PHPLaunchingMessages.class.getName();
+ 
+	private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle.getBundle(BUNDLE_NAME);
+
+	private PHPLaunchingMessages() {}
+
+	public static String getString(String key) {
+		try {
+			return RESOURCE_BUNDLE.getString(key);
+		} catch (MissingResourceException e) {
+			return '!' + key + '!';
+		}
+	}
+}
diff --git a/net.sourceforge.phpeclipse.launching/src/net/sourceforge/phpdt/internal/launching/PHPLaunchingMessages.properties b/net.sourceforge.phpeclipse.launching/src/net/sourceforge/phpdt/internal/launching/PHPLaunchingMessages.properties
new file mode 100644
index 0000000..bc2d362
--- /dev/null
+++ b/net.sourceforge.phpeclipse.launching/src/net/sourceforge/phpdt/internal/launching/PHPLaunchingMessages.properties
@@ -0,0 +1,6 @@
+
+#########################################
+# PHPLaunchingPlugin
+#########################################
+
+PHPLaunchingPlugin.internalErrorOccurred=Internal error occurred
\ No newline at end of file
diff --git a/net.sourceforge.phpeclipse.launching/src/net/sourceforge/phpdt/internal/launching/PHPLaunchingPlugin.java b/net.sourceforge.phpeclipse.launching/src/net/sourceforge/phpdt/internal/launching/PHPLaunchingPlugin.java
new file mode 100644
index 0000000..dee7aa5
--- /dev/null
+++ b/net.sourceforge.phpeclipse.launching/src/net/sourceforge/phpdt/internal/launching/PHPLaunchingPlugin.java
@@ -0,0 +1,35 @@
+package net.sourceforge.phpdt.internal.launching;
+
+import net.sourceforge.phpeclipse.PHPeclipsePlugin;
+import org.eclipse.core.resources.IWorkspace;
+import org.eclipse.core.runtime.IPluginDescriptor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Plugin;
+import org.eclipse.core.runtime.Status;
+
+public class PHPLaunchingPlugin extends Plugin {
+	public static final String PLUGIN_ID = "net.sourceforge.phpeclipse.launching"; //$NON-NLS-1$
+
+	protected static PHPLaunchingPlugin plugin;
+
+	public PHPLaunchingPlugin(IPluginDescriptor descriptor) {
+		super(descriptor);
+		plugin = this;
+	}
+
+	public static PHPLaunchingPlugin getDefault() {
+		return plugin;
+	}
+
+	public static IWorkspace getWorkspace() {
+		return PHPeclipsePlugin.getWorkspace();
+	}
+
+	public static void log(IStatus status) {
+		getDefault().getLog().log(status);
+	}
+
+	public static void log(Throwable e) {
+		log(new Status(IStatus.ERROR, PLUGIN_ID, IStatus.ERROR, PHPLaunchingMessages.getString("PHPLaunchingPlugin.internalErrorOccurred"), e)); //$NON-NLS-1$
+	}
+}
diff --git a/net.sourceforge.phpeclipse.launching/src/net/sourceforge/phpdt/internal/launching/PHPRuntime.java b/net.sourceforge.phpeclipse.launching/src/net/sourceforge/phpdt/internal/launching/PHPRuntime.java
new file mode 100644
index 0000000..03447e1
--- /dev/null
+++ b/net.sourceforge.phpeclipse.launching/src/net/sourceforge/phpdt/internal/launching/PHPRuntime.java
@@ -0,0 +1,174 @@
+package net.sourceforge.phpdt.internal.launching;
+
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.io.Reader;
+import java.io.StringReader;
+import java.io.Writer;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import javax.xml.parsers.SAXParserFactory;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.xml.sax.Attributes;
+import org.xml.sax.ContentHandler;
+import org.xml.sax.InputSource;
+import org.xml.sax.Locator;
+import org.xml.sax.SAXException;
+import org.xml.sax.XMLReader;
+
+public class PHPRuntime {
+	protected static PHPRuntime runtime;
+	
+	protected List installedInterpreters;
+	protected PHPInterpreter selectedInterpreter;
+	protected PHPRuntime() {
+		super();
+	}
+
+	public static PHPRuntime getDefault() {
+		if (runtime == null) {
+			runtime = new PHPRuntime();
+		}
+		return runtime;
+	}
+	
+	public PHPInterpreter getSelectedInterpreter() {
+		if (selectedInterpreter == null) {
+			loadRuntimeConfiguration();
+		}
+		return selectedInterpreter;
+	}
+
+	public PHPInterpreter getInterpreter(String name) {
+		Iterator interpreters = getInstalledInterpreters().iterator();
+		while(interpreters.hasNext()) {
+			PHPInterpreter each = (PHPInterpreter) interpreters.next();
+			if (each.getName().equals(name))
+				return each;
+		}
+		
+		return getSelectedInterpreter();
+	}
+
+	public void setSelectedInterpreter(PHPInterpreter anInterpreter) {
+		selectedInterpreter = anInterpreter;
+		saveRuntimeConfiguration();
+	}
+
+	public void addInstalledInterpreter(PHPInterpreter anInterpreter) {
+		getInstalledInterpreters().add(anInterpreter);
+		if (getInstalledInterpreters().size() == 1)
+			setSelectedInterpreter((PHPInterpreter) getInstalledInterpreters().get(0));
+
+		saveRuntimeConfiguration();
+	}
+
+	public List getInstalledInterpreters() {
+		if (installedInterpreters == null)
+			loadRuntimeConfiguration();
+		return installedInterpreters;
+	}
+	
+	public void setInstalledInterpreters(List newInstalledInterpreters) {
+		installedInterpreters = newInstalledInterpreters;
+		if (installedInterpreters.size() > 0)
+			setSelectedInterpreter((PHPInterpreter)installedInterpreters.get(0));
+		else
+			setSelectedInterpreter(null);
+	}
+	
+	protected void saveRuntimeConfiguration() {
+		writeXML(getRuntimeConfigurationWriter());
+	}
+
+	protected Writer getRuntimeConfigurationWriter() {
+		try {
+			OutputStream stream = new BufferedOutputStream(new FileOutputStream(getRuntimeConfigurationFile()));
+			return new OutputStreamWriter(stream);
+		} catch (FileNotFoundException e) {}
+
+		return null;
+	}
+	
+	protected void loadRuntimeConfiguration() {
+		installedInterpreters = new ArrayList();
+		try {
+			XMLReader reader = SAXParserFactory.newInstance().newSAXParser().getXMLReader();
+			reader.setContentHandler(getRuntimeConfigurationContentHandler());
+			reader.parse(new InputSource(getRuntimeConfigurationReader()));
+		} catch(Exception e) {
+			PHPLaunchingPlugin.getDefault().log(e);
+		}
+	}
+
+	protected Reader getRuntimeConfigurationReader() {
+		try {
+			return new FileReader(getRuntimeConfigurationFile());
+		} catch(FileNotFoundException e) {}
+		return new StringReader("");
+	}
+	
+	protected void writeXML(Writer writer) {
+		try {
+			writer.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?><runtimeconfig>");
+			Iterator interpretersIterator = installedInterpreters.iterator();
+			while (interpretersIterator.hasNext()) {
+				writer.write("<interpreter name=\"");
+				
+				PHPInterpreter entry = (PHPInterpreter) interpretersIterator.next();
+				writer.write(entry.getName());
+				writer.write("\" path=\"");
+				writer.write(entry.getInstallLocation().toString());
+				writer.write("\"");
+				if (entry.equals(selectedInterpreter))
+					writer.write(" selected=\"true\"");
+					
+				writer.write("/>");
+			}
+			writer.write("</runtimeconfig>");
+			writer.flush();
+		} catch(IOException e) {
+			PHPLaunchingPlugin.log(e);
+		}
+	}
+
+	protected ContentHandler getRuntimeConfigurationContentHandler() {
+		return new ContentHandler() {
+			public void setDocumentLocator(Locator locator) {}
+			public void startDocument() throws SAXException {}
+			public void endDocument() throws SAXException {}
+			public void startPrefixMapping(String prefix, String uri) throws SAXException {}
+			public void endPrefixMapping(String prefix) throws SAXException {}
+			public void startElement(String namespaceURI, String localName, String qName, Attributes atts) throws SAXException {
+				if ("interpreter".equals(qName)) {
+					String interpreterName = atts.getValue("name");
+					IPath installLocation = new Path(atts.getValue("path"));
+					PHPInterpreter interpreter = new PHPInterpreter(interpreterName, installLocation);
+					installedInterpreters.add(interpreter);
+					if (atts.getValue("selected") != null)
+						selectedInterpreter = interpreter;
+				}
+			}
+			public void endElement(String namespaceURI, String localName, String qName) throws SAXException {}
+			public void characters(char[] ch, int start, int length) throws SAXException {}
+			public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException {}
+			public void processingInstruction(String target, String data) throws SAXException {}
+			public void skippedEntity(String name) throws SAXException {}
+		};
+	}
+	
+	protected File getRuntimeConfigurationFile() {
+		IPath stateLocation = PHPLaunchingPlugin.getDefault().getStateLocation();
+		IPath fileLocation = stateLocation.append("runtimeConfiguration.xml");
+		return new File(fileLocation.toOSString());
+	}
+}
-- 
1.7.1