diff options
author | Chris Recoskie | 2009-03-16 14:36:24 +0000 |
---|---|---|
committer | Chris Recoskie | 2009-03-16 14:36:24 +0000 |
commit | 4d246d847757cdd3ea798d128b32867212db085d (patch) | |
tree | cca5365216f64626dcf6387f98237c479439c9f7 | |
parent | 3e2fede4d584226d44f2c11edeea98801d3fe571 (diff) | |
download | org.eclipse.cdt-4d246d847757cdd3ea798d128b32867212db085d.tar.gz org.eclipse.cdt-4d246d847757cdd3ea798d128b32867212db085d.tar.xz org.eclipse.cdt-4d246d847757cdd3ea798d128b32867212db085d.zip |
RESOLVED - bug 268615: add a way to specify a command launcher for the managed builder
https://bugs.eclipse.org/bugs/show_bug.cgi?id=268615
12 files changed, 201 insertions, 40 deletions
diff --git a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/core/MakeBuilder.java b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/core/MakeBuilder.java index 1b52d5ec80e..7e1bf37be52 100644 --- a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/core/MakeBuilder.java +++ b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/core/MakeBuilder.java @@ -22,6 +22,7 @@ import java.util.Map; import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.CommandLauncher; import org.eclipse.cdt.core.ErrorParserManager; +import org.eclipse.cdt.core.ICommandLauncher; import org.eclipse.cdt.core.model.ICModelMarker; import org.eclipse.cdt.core.resources.ACBuilder; import org.eclipse.cdt.core.resources.IConsole; @@ -153,7 +154,7 @@ public class MakeBuilder extends ACBuilder { isClean = true; String errMsg = null; - CommandLauncher launcher = new CommandLauncher(); + ICommandLauncher launcher = new CommandLauncher(); // Print the command for visual interaction. launcher.showCommand(true); @@ -218,7 +219,7 @@ public class MakeBuilder extends ACBuilder { // Before launching give visual cues via the monitor monitor.subTask(MakeMessages.getString("MakeBuilder.Invoking_Command") + launcher.getCommandLine()); //$NON-NLS-1$ if (launcher.waitAndRead(consoleOut, consoleErr, new SubProgressMonitor(monitor, 0)) - != CommandLauncher.OK) + != ICommandLauncher.OK) errMsg = launcher.getErrorMessage(); monitor.subTask(MakeMessages.getString("MakeBuilder.Updating_project")); //$NON-NLS-1$ refreshProject(currProject); diff --git a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig2/DefaultRunSIProvider.java b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig2/DefaultRunSIProvider.java index fbb27d9e62e..758911574c0 100644 --- a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig2/DefaultRunSIProvider.java +++ b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig2/DefaultRunSIProvider.java @@ -19,6 +19,7 @@ import java.util.Properties; import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.CommandLauncher; +import org.eclipse.cdt.core.ICommandLauncher; import org.eclipse.cdt.core.IMarkerGenerator; import org.eclipse.cdt.core.resources.IConsole; import org.eclipse.cdt.internal.core.ConsoleOutputSniffer; @@ -101,7 +102,7 @@ public class DefaultRunSIProvider implements IExternalScannerInfoProvider { monitor.subTask(MakeMessages.getString("ExternalScannerInfoProvider.Reading_Specs")); //$NON-NLS-1$ String errMsg = null; - CommandLauncher launcher = new CommandLauncher(); + ICommandLauncher launcher = new CommandLauncher(); // Print the command for visual interaction. launcher.showCommand(true); @@ -125,7 +126,7 @@ public class DefaultRunSIProvider implements IExternalScannerInfoProvider { p.getOutputStream().close(); } catch (IOException e) { } - if (launcher.waitAndRead(consoleOut, consoleErr, new SubProgressMonitor(monitor, 0)) != CommandLauncher.OK) { + if (launcher.waitAndRead(consoleOut, consoleErr, new SubProgressMonitor(monitor, 0)) != ICommandLauncher.OK) { errMsg = launcher.getErrorMessage(); } monitor.subTask(MakeMessages.getString("ExternalScannerInfoProvider.Parsing_Output")); //$NON-NLS-1$ @@ -213,7 +214,7 @@ public class DefaultRunSIProvider implements IExternalScannerInfoProvider { * @param launcher * @return */ - protected String[] setEnvironment(CommandLauncher launcher, Properties initialEnv) { + protected String[] setEnvironment(ICommandLauncher launcher, Properties initialEnv) { // Set the environmennt, some scripts may need the CWD var to be set. Properties props = initialEnv != null ? initialEnv : launcher.getEnvironment(); diff --git a/build/org.eclipse.cdt.managedbuilder.core/schema/buildDefinitions.exsd b/build/org.eclipse.cdt.managedbuilder.core/schema/buildDefinitions.exsd index da320978107..74d46d26b63 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/schema/buildDefinitions.exsd +++ b/build/org.eclipse.cdt.managedbuilder.core/schema/buildDefinitions.exsd @@ -1,6 +1,6 @@ <?xml version='1.0' encoding='UTF-8'?> <!-- Schema file written by PDE --> -<schema targetNamespace="org.eclipse.cdt.managedbuilder.core"> +<schema targetNamespace="org.eclipse.cdt.managedbuilder.core" xmlns="http://www.w3.org/2001/XMLSchema"> <annotation> <appInfo> <meta.schema plugin="org.eclipse.cdt.managedbuilder.core" id="buildDefinitions" name="Managed Build Definitions"/> @@ -11,6 +11,11 @@ </annotation> <element name="extension"> + <annotation> + <appInfo> + <meta.element /> + </appInfo> + </annotation> <complexType> <sequence> <element ref="projectType" minOccurs="0" maxOccurs="unbounded"/> @@ -1712,6 +1717,16 @@ If the builder supports specifying custom number of parallel jobs, the option de </documentation> </annotation> </attribute> + <attribute name="commandLauncher" type="string"> + <annotation> + <documentation> + A concrete Java class that implements org.eclipse.cdt.core.ICommandLauncher to launch the builder command. + </documentation> + <appInfo> + <meta.attribute kind="java" basedOn=":org.eclipse.cdt.core.ICommandLauncher"/> + </appInfo> + </annotation> + </attribute> </complexType> </element> diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/IBuilder.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/IBuilder.java index 1054f7a3574..ed41005f1ee 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/IBuilder.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/IBuilder.java @@ -10,6 +10,7 @@ *******************************************************************************/ package org.eclipse.cdt.managedbuilder.core; +import org.eclipse.cdt.core.ICommandLauncher; import org.eclipse.cdt.core.settings.model.extension.CBuildData; import org.eclipse.cdt.managedbuilder.macros.IFileContextBuildMacroValues; import org.eclipse.cdt.managedbuilder.macros.IReservedMacroNameSupplier; @@ -88,6 +89,8 @@ public interface IBuilder extends IBuildObject, IMakeBuilderInfo { static final String DEFAULT_TARGET_CLEAN = "clean"; //$NON-NLS-1$ static final String DEFAULT_TARGET_AUTO = "all"; //$NON-NLS-1$ + static final String ATTRIBUTE_COMMAND_LAUNCHER = "commandLauncher"; //$NON-NLS-1$ + /** * Returns the command line arguments to pass to the build/make utility used * to build a configuration. @@ -317,4 +320,12 @@ public interface IBuilder extends IBuildObject, IMakeBuilderInfo { boolean isSystemObject(); String getUniqueRealName(); + + /** + * Returns the ICommandLauncher which should be used to launch the builder command. + * + * @return ICommandLauncher + * @since 5.1 + */ + public ICommandLauncher getCommandLauncher(); } diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/buildmodel/CommandBuilder.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/buildmodel/CommandBuilder.java index 68927fbdbc4..d3aafff10c9 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/buildmodel/CommandBuilder.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/buildmodel/CommandBuilder.java @@ -19,6 +19,7 @@ import java.util.List; import java.util.Map; import org.eclipse.cdt.core.CommandLauncher; +import org.eclipse.cdt.core.ICommandLauncher; import org.eclipse.cdt.managedbuilder.buildmodel.IBuildCommand; import org.eclipse.cdt.managedbuilder.internal.core.ManagedMakeMessages; import org.eclipse.core.runtime.IProgressMonitor; @@ -154,7 +155,7 @@ public class CommandBuilder implements IBuildModelBuilder { monitor.beginTask("", getNumCommands()); //$NON-NLS-1$ monitor.subTask(""/*getCommandLine()*/); //$NON-NLS-1$ - CommandLauncher launcher = createLauncher(); + ICommandLauncher launcher = createLauncher(); int status = STATUS_OK; launcher.showCommand(true); @@ -173,11 +174,11 @@ public class CommandBuilder implements IBuildModelBuilder { int st = launcher.waitAndRead(wrap(out), wrap(err), new SubProgressMonitor(monitor, getNumCommands())); switch(st){ - case CommandLauncher.OK: + case ICommandLauncher.OK: if(fProcess.exitValue() != 0) status = STATUS_ERROR_BUILD; break; - case CommandLauncher.COMMAND_CANCELED: + case ICommandLauncher.COMMAND_CANCELED: status = STATUS_CANCELLED; fErrMsg = launcher.getErrorMessage(); if(DbgUtil.DEBUG) @@ -185,7 +186,7 @@ public class CommandBuilder implements IBuildModelBuilder { printMessage(fErrMsg, out); break; - case CommandLauncher.ILLEGAL_COMMAND: + case ICommandLauncher.ILLEGAL_COMMAND: default: status = STATUS_ERROR_LAUNCH; fErrMsg = launcher.getErrorMessage(); @@ -200,7 +201,7 @@ public class CommandBuilder implements IBuildModelBuilder { return status; } - protected CommandLauncher createLauncher() { + protected ICommandLauncher createLauncher() { // if(isWindows()) // return new CommandLauncher(); return new CommandSearchLauncher(); diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/Builder.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/Builder.java index 12c458086bf..c8dc53e95f1 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/Builder.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/Builder.java @@ -23,7 +23,9 @@ import java.util.SortedMap; import java.util.StringTokenizer; import org.eclipse.cdt.core.CCorePlugin; +import org.eclipse.cdt.core.CommandLauncher; import org.eclipse.cdt.core.ErrorParserManager; +import org.eclipse.cdt.core.ICommandLauncher; import org.eclipse.cdt.core.cdtvariables.CdtVariableException; import org.eclipse.cdt.core.cdtvariables.ICdtVariableManager; import org.eclipse.cdt.core.settings.model.COutputEntry; @@ -131,6 +133,9 @@ public class Builder extends BuildObject implements IBuilder, IMatchKeyProvider, private List identicalList; private ICOutputEntry[] outputEntries; + + private ICommandLauncher fCommandLauncher = null; + private IConfigurationElement fCommandLauncherElement = null; /* * C O N S T R U C T O R S @@ -318,6 +323,9 @@ public class Builder extends BuildObject implements IBuilder, IMatchKeyProvider, } else { setDirty(true); } + + fCommandLauncher = builder.fCommandLauncher; + fCommandLauncherElement = builder.fCommandLauncherElement; } public void copySettings(Builder builder, boolean allBuildSettings){ @@ -563,6 +571,12 @@ public class Builder extends BuildObject implements IBuilder, IMatchKeyProvider, } } } + + String commandLauncher = element.getAttribute(ATTRIBUTE_COMMAND_LAUNCHER); + if(commandLauncher != null && element instanceof DefaultManagedConfigElement){ + fCommandLauncherElement = ((DefaultManagedConfigElement)element).getConfigurationElement(); + } + } /* (non-Javadoc) @@ -2712,4 +2726,25 @@ public class Builder extends BuildObject implements IBuilder, IMatchKeyProvider, return getUniqueRealName(); } + public ICommandLauncher getCommandLauncher() { + if(fCommandLauncher != null) + return fCommandLauncher; + + if(fCommandLauncher == null && fCommandLauncherElement != null){ + try{ + fCommandLauncher = (ICommandLauncher)fCommandLauncherElement.createExecutableExtension(ATTRIBUTE_COMMAND_LAUNCHER); + return fCommandLauncher; + }catch(CoreException e){ + e.printStackTrace(); + } + } + if(fCommandLauncher == null && superClass != null) + return superClass.getCommandLauncher(); + + else if(fCommandLauncher == null) // catch all for backwards compatibility + fCommandLauncher = new CommandLauncher(); + + return fCommandLauncher; + } + } diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/CommonBuilder.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/CommonBuilder.java index 9fc4e3f2dc9..77d8ab3475b 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/CommonBuilder.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/CommonBuilder.java @@ -26,9 +26,9 @@ import org.eclipse.cdt.build.core.scannerconfig.CfgInfoContext; import org.eclipse.cdt.build.core.scannerconfig.ICfgScannerConfigBuilderInfo2Set; import org.eclipse.cdt.build.internal.core.scannerconfig2.CfgScannerConfigProfileManager; import org.eclipse.cdt.core.CCorePlugin; -import org.eclipse.cdt.core.CommandLauncher; import org.eclipse.cdt.core.ConsoleOutputStream; import org.eclipse.cdt.core.ErrorParserManager; +import org.eclipse.cdt.core.ICommandLauncher; import org.eclipse.cdt.core.IMarkerGenerator; import org.eclipse.cdt.core.ProblemMarkerInfo; import org.eclipse.cdt.core.envvar.IEnvironmentVariable; @@ -1934,7 +1934,7 @@ public class CommonBuilder extends ACBuilder { isClean = true; String errMsg = null; - CommandLauncher launcher = new CommandLauncher(); + ICommandLauncher launcher = builder.getCommandLauncher(); // Print the command for visual interaction. launcher.showCommand(true); @@ -1986,7 +1986,7 @@ public class CommonBuilder extends ACBuilder { // Before launching give visual cues via the monitor monitor.subTask(ManagedMakeMessages.getResourceString("MakeBuilder.Invoking_Command") + launcher.getCommandLine()); //$NON-NLS-1$ if (launcher.waitAndRead(consoleOut, consoleErr, new SubProgressMonitor(monitor, 0)) - != CommandLauncher.OK) + != ICommandLauncher.OK) errMsg = launcher.getErrorMessage(); monitor.subTask(ManagedMakeMessages.getResourceString("MakeBuilder.Updating_project")); //$NON-NLS-1$ diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/GeneratedMakefileBuilder.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/GeneratedMakefileBuilder.java index e06e4200a5a..661140ff0ef 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/GeneratedMakefileBuilder.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/GeneratedMakefileBuilder.java @@ -22,9 +22,9 @@ import java.util.Set; import java.util.Vector; import org.eclipse.cdt.core.CCorePlugin; -import org.eclipse.cdt.core.CommandLauncher; import org.eclipse.cdt.core.ConsoleOutputStream; import org.eclipse.cdt.core.ErrorParserManager; +import org.eclipse.cdt.core.ICommandLauncher; import org.eclipse.cdt.core.IMarkerGenerator; import org.eclipse.cdt.core.model.ICModelMarker; import org.eclipse.cdt.core.resources.ACBuilder; @@ -34,6 +34,7 @@ import org.eclipse.cdt.managedbuilder.buildmodel.IBuildDescription; import org.eclipse.cdt.managedbuilder.buildmodel.IBuildIOType; import org.eclipse.cdt.managedbuilder.buildmodel.IBuildResource; import org.eclipse.cdt.managedbuilder.buildmodel.IBuildStep; +import org.eclipse.cdt.managedbuilder.core.IBuilder; import org.eclipse.cdt.managedbuilder.core.IConfiguration; import org.eclipse.cdt.managedbuilder.core.IManagedBuildInfo; import org.eclipse.cdt.managedbuilder.core.ManagedBuildManager; @@ -945,7 +946,8 @@ public class GeneratedMakefileBuilder extends ACBuilder { // Get a launcher for the make command String errMsg = null; - CommandLauncher launcher = new CommandLauncher(); + IBuilder builder = info.getDefaultConfiguration().getBuilder(); + ICommandLauncher launcher = builder.getCommandLauncher(); launcher.showCommand(true); // Set the environmennt @@ -1016,7 +1018,7 @@ public class GeneratedMakefileBuilder extends ACBuilder { } if (launcher.waitAndRead(epm.getOutputStream(), epm.getOutputStream(), new SubProgressMonitor(monitor, - IProgressMonitor.UNKNOWN)) != CommandLauncher.OK) { + IProgressMonitor.UNKNOWN)) != ICommandLauncher.OK) { errMsg = launcher.getErrorMessage(); } } else { @@ -1087,10 +1089,10 @@ public class GeneratedMakefileBuilder extends ACBuilder { int state = launcher.waitAndRead(epm.getOutputStream(), epm.getOutputStream(), new SubProgressMonitor(monitor, IProgressMonitor.UNKNOWN)); - if(state != CommandLauncher.OK){ + if(state != ICommandLauncher.OK){ errMsg = launcher.getErrorMessage(); - if(state == CommandLauncher.COMMAND_CANCELED){ + if(state == ICommandLauncher.COMMAND_CANCELED){ //TODO: the better way of handling cancel is needed //currently the rebuild state is set to true forcing the full rebuild //on the next builder invocation diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/CommandLauncher.java b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/CommandLauncher.java index 7c16df74c1a..8a285644588 100644 --- a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/CommandLauncher.java +++ b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/CommandLauncher.java @@ -24,12 +24,13 @@ import org.eclipse.core.runtime.IProgressMonitor; /** * @noextend This class is not intended to be subclassed by clients. */ -public class CommandLauncher { +public class CommandLauncher implements ICommandLauncher { - public final static int COMMAND_CANCELED = 1; - public final static int ILLEGAL_COMMAND = -1; - public final static int OK = 0; + public final static int COMMAND_CANCELED = ICommandLauncher.COMMAND_CANCELED; + public final static int ILLEGAL_COMMAND = ICommandLauncher.ILLEGAL_COMMAND; + public final static int OK = ICommandLauncher.OK; + protected Process fProcess; protected boolean fShowCommand; protected String[] fCommandArgs; @@ -54,31 +55,43 @@ public class CommandLauncher { lineSeparator = System.getProperty("line.separator", "\n"); //$NON-NLS-1$ //$NON-NLS-2$ } - /** - * Sets if the command should be printed out first before executing + /* (non-Javadoc) + * @see org.eclipse.cdt.core.ICommandLauncher#showCommand(boolean) */ public void showCommand(boolean show) { fShowCommand = show; } + /* (non-Javadoc) + * @see org.eclipse.cdt.core.ICommandLauncher#getErrorMessage() + */ public String getErrorMessage() { return fErrorMessage; } + /* (non-Javadoc) + * @see org.eclipse.cdt.core.ICommandLauncher#setErrorMessage(java.lang.String) + */ public void setErrorMessage(String error) { fErrorMessage = error; } + /* (non-Javadoc) + * @see org.eclipse.cdt.core.ICommandLauncher#getCommandArgs() + */ public String[] getCommandArgs() { return fCommandArgs; } + /* (non-Javadoc) + * @see org.eclipse.cdt.core.ICommandLauncher#getEnvironment() + */ public Properties getEnvironment() { return EnvironmentReader.getEnvVars(); } - /** - * return the constructed Command line. + /* (non-Javadoc) + * @see org.eclipse.cdt.core.ICommandLauncher#getCommandLine() */ public String getCommandLine() { return getCommandLine(getCommandArgs()); @@ -94,8 +107,8 @@ public class CommandLauncher { return args; } - /** - * Execute a command + /* (non-Javadoc) + * @see org.eclipse.cdt.core.ICommandLauncher#execute(org.eclipse.core.runtime.IPath, java.lang.String[], java.lang.String[], org.eclipse.core.runtime.IPath) */ public Process execute(IPath commandPath, String[] args, String[] env, IPath changeToDirectory) { try { @@ -116,8 +129,8 @@ public class CommandLauncher { return fProcess; } - /** - * Reads output form the process to the streams. + /* (non-Javadoc) + * @see org.eclipse.cdt.core.ICommandLauncher#waitAndRead(java.io.OutputStream, java.io.OutputStream) */ public int waitAndRead(OutputStream out, OutputStream err) { if (fShowCommand) { @@ -133,11 +146,8 @@ public class CommandLauncher { return OK; } - /** - * Reads output form the process to the streams. A progress monitor is - * polled to test if the cancel button has been pressed. Destroys the - * process if the monitor becomes canceled override to implement a different - * way to read the process inputs + /* (non-Javadoc) + * @see org.eclipse.cdt.core.ICommandLauncher#waitAndRead(java.io.OutputStream, java.io.OutputStream, org.eclipse.core.runtime.IProgressMonitor) */ public int waitAndRead(OutputStream output, OutputStream err, IProgressMonitor monitor) { if (fShowCommand) { diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/ICommandLauncher.java b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/ICommandLauncher.java new file mode 100644 index 00000000000..e0c74a48a25 --- /dev/null +++ b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/ICommandLauncher.java @@ -0,0 +1,83 @@ +package org.eclipse.cdt.core; + +import java.io.OutputStream; +import java.util.Properties; + +import org.eclipse.core.runtime.IPath; +import org.eclipse.core.runtime.IProgressMonitor; + +/** + * An interface for launchers of external commands. + * + * @since 5.1 + */ +public interface ICommandLauncher { + + public final static int COMMAND_CANCELED = 1; + public final static int ILLEGAL_COMMAND = -1; + public final static int OK = 0; + + /** + * Sets if the command should be printed out first before executing. + */ + public void showCommand(boolean show); + + /** + * Returns a human readable error message corresponding to the last error encountered during command + * execution. + * + * @return A String corresponding to the error, or <code>null</code> if there has been no error. + */ + public String getErrorMessage(); + + /** + * Sets the human readable error message corresponding to the last error encountered during command + * execution. A subsequent call to getErrorMessage() will return this string. + * + * @param error A String corresponding to the error message, or <code>null</code> if the error state is + * intended to be cleared. + */ + public void setErrorMessage(String error); + + /** + * Returns an array of the command line arguments that were last used to execute a command. + * + * @return an array of type String[] corresponding to the arguments. The array can be empty, but should not + * be null. + */ + public String[] getCommandArgs(); + + /** + * Returns the set of environment variables in the context of which + * this launcher will execute commands. + * + * @return Properties + */ + public Properties getEnvironment(); + + /** + * Returns the constructed command line of the last command executed. + * + * @return String + */ + public String getCommandLine(); + + /** + * Execute a command + */ + public Process execute(IPath commandPath, String[] args, String[] env, IPath changeToDirectory); + + /** + * Reads output form the process to the streams. + */ + public int waitAndRead(OutputStream out, OutputStream err); + + /** + * Reads output form the process to the streams. A progress monitor is + * polled to test if the cancel button has been pressed. Destroys the + * process if the monitor becomes canceled override to implement a different + * way to read the process inputs + */ + public int waitAndRead(OutputStream output, OutputStream err, IProgressMonitor monitor); + +}
\ No newline at end of file diff --git a/debug/org.eclipse.cdt.debug.mi.core/mi/org/eclipse/cdt/debug/mi/core/command/factories/win32/CygwinMIEnvironmentCD.java b/debug/org.eclipse.cdt.debug.mi.core/mi/org/eclipse/cdt/debug/mi/core/command/factories/win32/CygwinMIEnvironmentCD.java index 97d67dfb5ea..c7d0282b2cc 100644 --- a/debug/org.eclipse.cdt.debug.mi.core/mi/org/eclipse/cdt/debug/mi/core/command/factories/win32/CygwinMIEnvironmentCD.java +++ b/debug/org.eclipse.cdt.debug.mi.core/mi/org/eclipse/cdt/debug/mi/core/command/factories/win32/CygwinMIEnvironmentCD.java @@ -14,6 +14,7 @@ package org.eclipse.cdt.debug.mi.core.command.factories.win32; import java.io.ByteArrayOutputStream; import java.io.IOException; import org.eclipse.cdt.core.CommandLauncher; +import org.eclipse.cdt.core.ICommandLauncher; import org.eclipse.core.runtime.Path; /** @@ -24,14 +25,14 @@ public class CygwinMIEnvironmentCD extends WinMIEnvironmentCD { CygwinMIEnvironmentCD( String miVersion, String path ) { super( miVersion, path ); // Use the cygpath utility to convert the path - CommandLauncher launcher = new CommandLauncher(); + ICommandLauncher launcher = new CommandLauncher(); ByteArrayOutputStream out = new ByteArrayOutputStream(); ByteArrayOutputStream err = new ByteArrayOutputStream(); String newPath = null; launcher.execute( new Path( "cygpath" ), //$NON-NLS-1$ new String[]{ "-u", path }, //$NON-NLS-1$ new String[0], new Path( "." ) ); //$NON-NLS-1$ - if ( launcher.waitAndRead( out, err ) == CommandLauncher.OK ) { + if ( launcher.waitAndRead( out, err ) == ICommandLauncher.OK ) { newPath = out.toString(); if ( newPath != null ) { newPath = newPath.trim(); diff --git a/debug/org.eclipse.cdt.debug.mi.core/mi/org/eclipse/cdt/debug/mi/core/command/factories/win32/CygwinMIEnvironmentDirectory.java b/debug/org.eclipse.cdt.debug.mi.core/mi/org/eclipse/cdt/debug/mi/core/command/factories/win32/CygwinMIEnvironmentDirectory.java index 09572ac54fd..e06a9b7b354 100644 --- a/debug/org.eclipse.cdt.debug.mi.core/mi/org/eclipse/cdt/debug/mi/core/command/factories/win32/CygwinMIEnvironmentDirectory.java +++ b/debug/org.eclipse.cdt.debug.mi.core/mi/org/eclipse/cdt/debug/mi/core/command/factories/win32/CygwinMIEnvironmentDirectory.java @@ -14,6 +14,7 @@ import java.io.ByteArrayOutputStream; import java.util.StringTokenizer; import org.eclipse.cdt.core.CommandLauncher; +import org.eclipse.cdt.core.ICommandLauncher; import org.eclipse.cdt.debug.mi.core.command.MIEnvironmentDirectory; import org.eclipse.core.runtime.Path; @@ -85,14 +86,14 @@ public class CygwinMIEnvironmentDirectory extends MIEnvironmentDirectory { */ private String convertPath0(String path) { String result = path; - CommandLauncher launcher = new CommandLauncher(); + ICommandLauncher launcher = new CommandLauncher(); ByteArrayOutputStream out = new ByteArrayOutputStream(); launcher.execute( new Path("cygpath"), //$NON-NLS-1$ new String[] { "-p", "-u", path }, //$NON-NLS-1$ //$NON-NLS-2$ new String[0], new Path(".")); //$NON-NLS-1$ - if (launcher.waitAndRead(out, out) == CommandLauncher.OK) + if (launcher.waitAndRead(out, out) == ICommandLauncher.OK) result = out.toString().trim(); return result; } |