You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by ng...@apache.org on 2006/03/11 20:18:52 UTC

svn commit: r385141 - in /jakarta/commons/sandbox/exec/trunk/src: main/java/org/apache/commons/exec/ main/java/org/apache/commons/exec/environment/ main/java/org/apache/commons/exec/launcher/ test/java/org/apache/commons/exec/

Author: ngn
Date: Sat Mar 11 11:18:50 2006
New Revision: 385141

URL: http://svn.apache.org/viewcvs?rev=385141&view=rev
Log:
Based on popular demand, CommandLine is back. Next step will be to further simplify the API.

Added:
    jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/CommandLine.java
      - copied, changed from r377093, jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/CommandLine.java
    jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/CommandLineArgument.java
      - copied unchanged from r377093, jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/CommandLineArgument.java
    jakarta/commons/sandbox/exec/trunk/src/test/java/org/apache/commons/exec/CommandLineTest.java
      - copied, changed from r377093, jakarta/commons/sandbox/exec/trunk/src/test/java/org/apache/commons/exec/CommandLineTest.java
Modified:
    jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/Exec.java
    jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/Execute.java
    jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/ExecuteWatchdog.java
    jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/environment/DefaultProcessingEnvironment.java
    jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/environment/OpenVmsProcessingEnvironment.java
    jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/launcher/CommandLauncher.java
    jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/launcher/CommandLauncherImpl.java
    jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/launcher/CommandLauncherProxy.java
    jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/launcher/Java13CommandLauncher.java
    jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/launcher/OS2CommandLauncher.java
    jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/launcher/VmsCommandLauncher.java
    jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/launcher/WinNTCommandLauncher.java
    jakarta/commons/sandbox/exec/trunk/src/test/java/org/apache/commons/exec/ExecTest.java
    jakarta/commons/sandbox/exec/trunk/src/test/java/org/apache/commons/exec/TestUtil.java

Copied: jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/CommandLine.java (from r377093, jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/CommandLine.java)
URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/CommandLine.java?p2=jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/CommandLine.java&p1=jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/CommandLine.java&r1=377093&r2=385141&rev=385141&view=diff
==============================================================================
--- jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/CommandLine.java (original)
+++ jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/CommandLine.java Sat Mar 11 11:18:50 2006
@@ -17,59 +17,304 @@
 
 package org.apache.commons.exec;
 
+import java.io.File;
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.ListIterator;
+import java.util.StringTokenizer;
+import java.util.Vector;
+
 /**
  * CommandLine objects help handling command lines specifying processes to
  * execute. The class can be used to define a command line as nested elements or
  * as a helper to define a command line by an application.
  */
-public interface CommandLine {
+public class CommandLine {
+
+    private static final String SINGLE_QUOTE = "\'";
+
+    private static final String DOUBLE_QUOTE = "\"";
+    
+    /**
+     * The arguments of the command.
+     */
+    private Vector arguments = new Vector();
+
+    /**
+     * The program to execute.
+     */
+    private String executable = null;
+
+    /**
+     * Create a command line from a string.
+     * 
+     * @param toProcess
+     *            the line: the first element becomes the executable, the rest
+     *            the arguments
+     */
+    public CommandLine(final String toProcess) {
+        super();
+        String[] tmp = translateCommandline(toProcess);
+        if (tmp != null && tmp.length > 0) {
+            setExecutable(tmp[0]);
+            for (int i = 1; i < tmp.length; i++) {
+                createArgument(tmp[i]);
+            }
+        }
+    }
+
+    /**
+     * Create an empty command line.
+     */
+    public CommandLine() {
+        super();
+    }
+
+    /**
+     * Creates an argument object.
+     * <p>
+     * Each commandline object has at most one instance of the argument class.
+     * This method calls <code>this.createArgument(false)</code>.
+     * </p>
+     * 
+     * @return the argument object.
+     */
+    private CommandLineArgument createArgument(final String value) {
+        CommandLineArgument argument = new CommandLineArgument(value);
+        arguments.addElement(argument);
+        return argument;
+    }
+
+    public void setExecutable(final String executable) {
+        if (executable == null || executable.length() == 0) {
+            return;
+        }
+        this.executable = executable.replace('/', File.separatorChar).replace(
+                '\\', File.separatorChar);
+    }
+
+    public String getExecutable() {
+        return executable;
+    }
+
+    public void addArguments(final String[] line) {
+        for (int i = 0; i < line.length; i++) {
+            createArgument(line[i]);
+        }
+    }
+
+    public void addArgument(final String arg) {
+        createArgument(arg);
+    }
+
+    public String[] getCommandline() {
+        List commands = new LinkedList();
+        ListIterator list = commands.listIterator();
+        addCommandToList(list);
+        final String[] result = new String[commands.size()];
+        return (String[]) commands.toArray(result);
+    }
 
     /**
-     * Sets the executable to run. All file separators in the string are
-     * converted to the platform specific value
+     * Add the entire command, including (optional) executable to a list.
+     * 
+     * @param list
      */
-    void setExecutable(final String executable);
+    private void addCommandToList(final ListIterator list) {
+        if (executable != null) {
+            list.add(executable);
+        }
+        addArgumentsToList(list);
+    }
+
+    public String[] getArguments() {
+        List result = new ArrayList(arguments.size() * 2);
+        addArgumentsToList(result.listIterator());
+        String[] res = new String[result.size()];
+        return (String[]) result.toArray(res);
+    }
 
     /**
-     * Get the executable.
+     * append all the arguments to the tail of a supplied list
      * 
-     * @return the program to run -null if not yet set
+     * @param list
      */
-    String getExecutable();
+    private void addArgumentsToList(final ListIterator list) {
+        for (int i = 0; i < arguments.size(); i++) {
+            CommandLineArgument arg = (CommandLineArgument) arguments
+                    .elementAt(i);
+            String[] s = arg.getParts();
+            if (s != null) {
+                for (int j = 0; j < s.length; j++) {
+                    list.add(s[j]);
+                }
+            }
+        }
+    }
 
     /**
-     * Append the arguments to the existing command.
+     * Stringify operator returns the command line as a string.
      * 
-     * @param line
-     *            an array of arguments to append
+     * @return the command line
      */
-    void addArguments(final String[] line);
+    public String toString() {
+        return toString(getCommandline());
+    }
 
     /**
-     * Append a single argument to the current command.
-     * @param arg the argument to add.
+     * Put quotes around the given String if necessary.
+     * <p>
+     * If the argument doesn't include spaces or quotes, return it as is. If it
+     * contains double quotes, use single quotes - else surround the argument by
+     * double quotes.
+     * </p>
+     * 
      */
-    void addArgument(final String arg);
+    public static String quoteArgument(final String argument) {
+        final StringBuffer buf = new StringBuffer();
+        if (argument.indexOf(DOUBLE_QUOTE) > -1) {
+            if (argument.indexOf(SINGLE_QUOTE) > -1) {
+                throw new IllegalArgumentException(
+                        "Can\'t handle single and double quotes in same argument");
+            } else {
+                return buf.append(SINGLE_QUOTE).append(argument).append(SINGLE_QUOTE).toString();
+            }
+        } else if (argument.indexOf(SINGLE_QUOTE) > -1 || argument.indexOf(" ") > -1) {
+            return buf.append(DOUBLE_QUOTE).append(argument).append(DOUBLE_QUOTE).toString();
+        } else {
+            return argument;
+        }
+    }
 
     /**
-     * Returns the executable and all defined arguments.
+     * Quotes the parts of the given array in way that makes them usable as
+     * command line arguments.
+     * 
+     * @return empty string for null or no command, else every argument split by
+     *         spaces and quoted by quoting rules
      */
-    String[] getCommandline();
+    public static String toString(final String[] line) {
+        // empty path return empty string
+        if (line == null || line.length == 0) {
+            return "";
+        }
+
+        // path containing one or more elements
+        final StringBuffer result = new StringBuffer();
+        for (int i = 0; i < line.length; i++) {
+            if (i > 0) {
+                result.append(' ');
+            }
+            result.append(quoteArgument(line[i]));
+        }
+        return result.toString();
+    }
 
     /**
-     * Returns all arguments defined by <code>addLine</code>,
-     * <code>addValue</code> or the argument object.
+     * Crack a command line.
+     * 
+     * @param toProcess
+     *            the command line to process
+     * @return the command line broken into strings. An empty or null toProcess
+     *         parameter results in a zero sized array
      */
-    String[] getArguments();
+    public static String[] translateCommandline(final String toProcess) {
+        if (toProcess == null || toProcess.length() == 0) {
+            // no command? no string
+            return new String[0];
+        }
+
+        // parse with a simple finite state machine
+
+        final int normal = 0;
+        final int inQuote = 1;
+        final int inDoubleQuote = 2;
+        int state = normal;
+        StringTokenizer tok = new StringTokenizer(toProcess, "\"\' ", true);
+        Vector v = new Vector();
+        StringBuffer current = new StringBuffer();
+        boolean lastTokenHasBeenQuoted = false;
+
+        while (tok.hasMoreTokens()) {
+            String nextTok = tok.nextToken();
+            switch (state) {
+            case inQuote:
+                if ("\'".equals(nextTok)) {
+                    lastTokenHasBeenQuoted = true;
+                    state = normal;
+                } else {
+                    current.append(nextTok);
+                }
+                break;
+            case inDoubleQuote:
+                if ("\"".equals(nextTok)) {
+                    lastTokenHasBeenQuoted = true;
+                    state = normal;
+                } else {
+                    current.append(nextTok);
+                }
+                break;
+            default:
+                if ("\'".equals(nextTok)) {
+                    state = inQuote;
+                } else if ("\"".equals(nextTok)) {
+                    state = inDoubleQuote;
+                } else if (" ".equals(nextTok)) {
+                    if (lastTokenHasBeenQuoted || current.length() != 0) {
+                        v.addElement(current.toString());
+                        current = new StringBuffer();
+                    }
+                } else {
+                    current.append(nextTok);
+                }
+                lastTokenHasBeenQuoted = false;
+                break;
+            }
+        }
+
+        if (lastTokenHasBeenQuoted || current.length() != 0) {
+            v.addElement(current.toString());
+        }
+
+        if (state == inQuote || state == inDoubleQuote) {
+            throw new IllegalArgumentException(
+                    "Unbalanced quotes in " + toProcess);
+        }
+
+        String[] args = new String[v.size()];
+        v.copyInto(args);
+        return args;
+    }
 
     /**
-     * Clear out the whole command line.
+     * size operator. This actually creates the command line, so it is not a
+     * zero cost operation.
+     * 
+     * @return number of elements in the command, including the executable
      */
-    void clear();
+    public int size() {
+        return getCommandline().length;
+    }
 
     /**
-     * Clear out the arguments but leave the executable in place for another
-     * operation.
+     * Generate a deep clone of the contained object.
+     * 
+     * @return a clone of the contained object
+     * @throws CloneNotSupportedException 
      */
-    void clearArgs();
+    public Object clone() throws CloneNotSupportedException {
+        CommandLine c = (CommandLine) super.clone();
+        c.arguments = (Vector) arguments.clone();
+        return c;
+    }
+
+    public void clear() {
+        executable = null;
+        arguments.removeAllElements();
+    }
+
+    public void clearArgs() {
+        arguments.removeAllElements();
+    }
 }

Modified: jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/Exec.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/Exec.java?rev=385141&r1=385140&r2=385141&view=diff
==============================================================================
--- jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/Exec.java (original)
+++ jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/Exec.java Sat Mar 11 11:18:50 2006
@@ -149,7 +149,6 @@
         // try to find the executable
         File executableFile = new File(exec);
         if (executableFile.exists()) {
-        	
             return executableFile.getAbsolutePath();
         }
 
@@ -201,22 +200,22 @@
      *             <li>this list is not exhaustive or limitative</li>
      *             </ul>
      */
-    public void execute(final String[] cl) throws IOException {
+    public void execute(final CommandLine cl) throws IOException {
         execute(cl, null, new LogOutputStream(1), new LogOutputStream(2));
     }
 
-    public void execute(final String[] cl, final Map env)
+    public void execute(final CommandLine cl, final Map env)
             throws IOException {
         execute(cl, env, new LogOutputStream(1), new LogOutputStream(2));
     }
 
-    public void execute(final String[] cl, final OutputStream out,
+    public void execute(final CommandLine cl, final OutputStream out,
             final OutputStream error) throws IOException {
         execute(cl, null, out, error);
 
     }
 
-    public void execute(final String[] cmdl, final Map env,
+    public void execute(final CommandLine cmdl, final Map env,
             final OutputStream out, final OutputStream error)
             throws IOException {
         File savedDir = dir; // possibly altered in prepareExec
@@ -228,8 +227,7 @@
             environment = env;
         }
 
-        cmdl[0] = resolveExecutable(cmdl[0], false);
-
+        cmdl.setExecutable(resolveExecutable(executable, false));
         checkConfiguration(cmdl);
 
         try {
@@ -240,7 +238,7 @@
         }
     }
 
-    public void execute(final String[] cmdl, final Map env,
+    public void execute(final CommandLine cmdl, final Map env,
             final InputStream in, final OutputStream out,
             final OutputStream error) throws IOException {
         File savedDir = dir; // possibly altered in prepareExec
@@ -252,7 +250,7 @@
             environment = env;
         }
 
-        cmdl[0] = resolveExecutable(cmdl[0], false);
+        cmdl.setExecutable(resolveExecutable(executable, false));
         checkConfiguration(cmdl);
 
         try {
@@ -269,9 +267,9 @@
      * @throws ExecuteException
      *             if there are missing required parameters
      */
-    protected void checkConfiguration(final String[] cmdl)
+    protected void checkConfiguration(final CommandLine cmdl)
             throws IOException {
-        if (cmdl.length == 0) {
+        if (cmdl.getExecutable() == null) {
             throw new IOException("No executable specified");
         }
         if (dir != null && !dir.exists()) {
@@ -352,7 +350,7 @@
 
             // redirector.complete();
             if (Execute.isFailure(returnCode)) {
-                throw new ExecuteException(exe.getCommandline()[0]
+                throw new ExecuteException(exe.getCommandline().getExecutable()
                         + " failed with return code", returnCode);
             }
         } else {
@@ -370,7 +368,7 @@
      *             if the new process could not be started only if
      *             failIfExecFails is set to true (the default)
      */
-    protected void runExec(final Execute exe, final String[] cmdl)
+    protected void runExec(final Execute exe, final CommandLine cmdl)
             throws IOException {
         // show the command
         log.debug(cmdl.toString());

Modified: jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/Execute.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/Execute.java?rev=385141&r1=385140&r2=385141&view=diff
==============================================================================
--- jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/Execute.java (original)
+++ jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/Execute.java Sat Mar 11 11:18:50 2006
@@ -40,7 +40,7 @@
     /** Invalid exit code. * */
     public static final int INVALID = Integer.MAX_VALUE;
 
-    private String[] cmdl = null;
+    private CommandLine cmdl = null;
 
     private Map environment = null;
 
@@ -132,7 +132,7 @@
      * 
      * @return the command line used to create a subprocess
      */
-    public String[] getCommandline() {
+    public CommandLine getCommandline() {
         return cmdl;
     }
 
@@ -142,7 +142,7 @@
      * @param commandline
      *            the command line of the subprocess to launch
      */
-    public void setCommandline(final String[] commandline) {
+    public void setCommandline(final CommandLine commandline) {
         cmdl = commandline;
     }
 
@@ -211,7 +211,7 @@
      * @throws IOException
      *             forwarded from the particular launcher used
      */
-    public static Process launch(final String[] command, final Map env, final File dir)
+    public static Process launch(final CommandLine command, final Map env, final File dir)
             throws IOException {
         CommandLauncher launcher = vmLauncher;
 
@@ -419,7 +419,7 @@
      * @throws ExecuteException
      *             if the command does not return 0.
      */
-    public static void runCommand(final String[] cmdline)
+    public static void runCommand(final CommandLine cmdline)
             throws IOException {
         try {
             LOG.debug(cmdline);
@@ -428,12 +428,12 @@
             exe.setCommandline(cmdline);
             int retval = exe.execute();
             if (isFailure(retval)) {
-                throw new ExecuteException(cmdline[0]
+                throw new ExecuteException(cmdline.getExecutable()
                         + " failed with return code", retval);
             }
         } catch (java.io.IOException exc) {
             throw new IOException("Could not launch "
-                    + cmdline[0] + ": " + exc);
+                    + cmdline.getExecutable() + ": " + exc);
         }
     }
 

Modified: jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/ExecuteWatchdog.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/ExecuteWatchdog.java?rev=385141&r1=385140&r2=385141&view=diff
==============================================================================
--- jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/ExecuteWatchdog.java (original)
+++ jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/ExecuteWatchdog.java Sat Mar 11 11:18:50 2006
@@ -65,6 +65,15 @@
     }
 
     /**
+     * @see #ExecuteWatchdog(long)
+     * @deprecated Use constructor with a long type instead. (1.4.x
+     *             compatibility)
+     */
+    public ExecuteWatchdog(final int timeout) {
+        this((long) timeout);
+    }
+
+    /**
      * Watches the given process and terminates it, if it runs for too long. All
      * information from the previous run are reset.
      * 

Modified: jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/environment/DefaultProcessingEnvironment.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/environment/DefaultProcessingEnvironment.java?rev=385141&r1=385140&r2=385141&view=diff
==============================================================================
--- jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/environment/DefaultProcessingEnvironment.java (original)
+++ jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/environment/DefaultProcessingEnvironment.java Sat Mar 11 11:18:50 2006
@@ -27,6 +27,7 @@
 import java.util.HashMap;
 import java.util.Map;
 
+import org.apache.commons.exec.CommandLine;
 import org.apache.commons.exec.Execute;
 import org.apache.commons.exec.OS;
 import org.apache.commons.exec.PumpStreamHandler;
@@ -114,39 +115,37 @@
         return new BufferedReader(new StringReader(toString(out)));
     }
 
-    protected String[] getProcEnvCommand() {
-        String[] commandLine;
+    protected CommandLine getProcEnvCommand() {
+        CommandLine commandLine = new CommandLine();
         if (OS.isFamilyOS2()) {
             // OS/2 - use same mechanism as Windows 2000
-        	commandLine = new String[]{"cmd", "/c", "set"};
+            commandLine.setExecutable("cmd");
+            commandLine.addArguments(new String[] {"/c", "set"});
         } else if (OS.isFamilyWindows()) {
             // Determine if we're running under XP/2000/NT or 98/95
-        	commandLine = new String[3];
             if (OS.isFamilyWin9x()) {
-                commandLine[0] = "command.com";
+                commandLine.setExecutable("command.com");
                 // Windows 98/95
             } else {
-            	commandLine[0] = "cmd";
+                commandLine.setExecutable("cmd");
                 // Windows XP/2000/NT/2003
             }
-            commandLine[1] = "/c";
-            commandLine[2] = "set";
+            commandLine.addArguments(new String[] {"/c", "set"});
         } else if (OS.isFamilyZOS() || OS.isFamilyUnix()) {
             // On most systems one could use: /bin/sh -c env
 
             // Some systems have /bin/env, others /usr/bin/env, just try
-        	commandLine = new String[1];
             if (new File("/bin/env").canRead()) {
-                commandLine[0] = "/bin/env";
+                commandLine.setExecutable("/bin/env");
             } else if (new File("/usr/bin/env").canRead()) {
-            	commandLine[0] = "/usr/bin/env";
+                commandLine.setExecutable("/usr/bin/env");
             } else {
                 // rely on PATH
-            	commandLine[0] =  "env";
+                commandLine.setExecutable("env");
             }
         } else if (OS.isFamilyNetware() || OS.isFamilyOS400()) {
             // rely on PATH
-        	commandLine = new String[]{"env"};
+            commandLine.setExecutable("env");
         } else {
             // MAC OS 9 and previous
             // TODO: I have no idea how to get it, someone must fix it

Modified: jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/environment/OpenVmsProcessingEnvironment.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/environment/OpenVmsProcessingEnvironment.java?rev=385141&r1=385140&r2=385141&view=diff
==============================================================================
--- jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/environment/OpenVmsProcessingEnvironment.java (original)
+++ jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/environment/OpenVmsProcessingEnvironment.java Sat Mar 11 11:18:50 2006
@@ -23,6 +23,8 @@
 import java.util.Iterator;
 import java.util.Map;
 
+import org.apache.commons.exec.CommandLine;
+
 public class OpenVmsProcessingEnvironment extends DefaultProcessingEnvironment {
 
     public synchronized Map getProcEnvironment() throws IOException {
@@ -38,8 +40,11 @@
         return procEnvironment;
     }
 
-    protected String[] getProcEnvCommand() {
-        return new String[]{"show", "logical"};
+    protected CommandLine getProcEnvCommand() {
+        CommandLine commandLine = new CommandLine();
+        commandLine.setExecutable("show");
+        commandLine.addArgument("logical");
+        return commandLine;
     }
 
     /**

Modified: jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/launcher/CommandLauncher.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/launcher/CommandLauncher.java?rev=385141&r1=385140&r2=385141&view=diff
==============================================================================
--- jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/launcher/CommandLauncher.java (original)
+++ jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/launcher/CommandLauncher.java Sat Mar 11 11:18:50 2006
@@ -21,6 +21,9 @@
 import java.io.IOException;
 import java.util.Map;
 
+import org.apache.commons.exec.CommandLine;
+import org.apache.commons.exec.environment.EnvironmentUtil;
+
 public interface CommandLauncher {
 
     /**
@@ -34,7 +37,7 @@
      * @throws IOException
      *             if attempting to run a command in a specific directory
      */
-    Process exec(final String[] cmd, final Map env)
+    Process exec(final CommandLine cmd, final Map env)
             throws IOException;
 
     /**
@@ -52,6 +55,6 @@
      * @throws IOException
      *             if trying to change directory
      */
-    Process exec(final String[] cmd, final Map env,
+    Process exec(final CommandLine cmd, final Map env,
             final File workingDir) throws IOException;
 }

Modified: jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/launcher/CommandLauncherImpl.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/launcher/CommandLauncherImpl.java?rev=385141&r1=385140&r2=385141&view=diff
==============================================================================
--- jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/launcher/CommandLauncherImpl.java (original)
+++ jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/launcher/CommandLauncherImpl.java Sat Mar 11 11:18:50 2006
@@ -21,6 +21,7 @@
 import java.io.IOException;
 import java.util.Map;
 
+import org.apache.commons.exec.CommandLine;
 import org.apache.commons.exec.environment.EnvironmentUtil;
 
 /**
@@ -30,17 +31,17 @@
  */
 public abstract class CommandLauncherImpl implements CommandLauncher {
 
-    public Process exec(final String[] cmd, final Map env)
+    public Process exec(final CommandLine cmd, final Map env)
             throws IOException {
         String[] envVar = null;
         if(env != null) {
             envVar = EnvironmentUtil.toStrings(env);
         }
         
-        return Runtime.getRuntime().exec(cmd,
+        return Runtime.getRuntime().exec(cmd.getCommandline(),
                 envVar);
     }
 
-    public abstract Process exec(final String[] cmd, final Map env,
+    public abstract Process exec(final CommandLine cmd, final Map env,
             final File workingDir) throws IOException;
 }

Modified: jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/launcher/CommandLauncherProxy.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/launcher/CommandLauncherProxy.java?rev=385141&r1=385140&r2=385141&view=diff
==============================================================================
--- jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/launcher/CommandLauncherProxy.java (original)
+++ jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/launcher/CommandLauncherProxy.java Sat Mar 11 11:18:50 2006
@@ -20,6 +20,8 @@
 import java.io.IOException;
 import java.util.Map;
 
+import org.apache.commons.exec.CommandLine;
+
 /**
  * A command launcher that proxies another command launcher. Sub-classes
  * override exec(args, env, workdir)
@@ -43,7 +45,7 @@
      * @throws IOException
      *             forwarded from the exec method of the command launcher
      */
-    public Process exec(final String[] cmd, final Map env)
+    public Process exec(final CommandLine cmd, final Map env)
             throws IOException {
         return myLauncher.exec(cmd, env);
     }

Modified: jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/launcher/Java13CommandLauncher.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/launcher/Java13CommandLauncher.java?rev=385141&r1=385140&r2=385141&view=diff
==============================================================================
--- jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/launcher/Java13CommandLauncher.java (original)
+++ jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/launcher/Java13CommandLauncher.java Sat Mar 11 11:18:50 2006
@@ -21,6 +21,7 @@
 import java.io.IOException;
 import java.util.Map;
 
+import org.apache.commons.exec.CommandLine;
 import org.apache.commons.exec.environment.EnvironmentUtil;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
@@ -48,7 +49,7 @@
 	 * @throws IOException
 	 *             probably forwarded from Runtime#exec
 	 */
-	public Process exec(final String[] cmd, final Map env,
+	public Process exec(final CommandLine cmd, final Map env,
 			final File workingDir) throws IOException {
 		log.debug("Execute:Java13CommandLauncher: " + cmd);
 
@@ -57,7 +58,7 @@
 			envVars = EnvironmentUtil.toStrings(env);
 		}
 
-		return Runtime.getRuntime().exec(cmd,
+		return Runtime.getRuntime().exec(cmd.getCommandline(),
                 envVars, workingDir);
 	}
 }

Modified: jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/launcher/OS2CommandLauncher.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/launcher/OS2CommandLauncher.java?rev=385141&r1=385140&r2=385141&view=diff
==============================================================================
--- jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/launcher/OS2CommandLauncher.java (original)
+++ jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/launcher/OS2CommandLauncher.java Sat Mar 11 11:18:50 2006
@@ -21,6 +21,8 @@
 import java.io.IOException;
 import java.util.Map;
 
+import org.apache.commons.exec.CommandLine;
+
 /**
  * A command launcher for OS/2 that uses 'cmd.exe' when launching commands in
  * directories other than the current working directory.
@@ -48,20 +50,16 @@
      * @throws IOException
      *             forwarded from the exec method of the command launcher
      */
-    public Process exec(final String[] cmd, final Map env,
+    public Process exec(final CommandLine cmd, final Map env,
             final File workingDir) throws IOException {
         if (workingDir == null) {
             return exec(cmd, env);
         }
 
-        // TODO add code for switching to working dir
-        String[] newCmd = new String[cmd.length + 2];
-        newCmd[0] = "cmd";
-        newCmd[1] = "/c";
-
-        for (int i = 0; i < cmd.length; i++) {
-			newCmd[i + 2] = cmd[i];
-		}
+        CommandLine newCmd = new CommandLine();
+        newCmd.setExecutable("cmd");
+        newCmd.addArgument("/c");
+        newCmd.addArguments(cmd.getCommandline());
 
         return exec(newCmd, env);
     }

Modified: jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/launcher/VmsCommandLauncher.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/launcher/VmsCommandLauncher.java?rev=385141&r1=385140&r2=385141&view=diff
==============================================================================
--- jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/launcher/VmsCommandLauncher.java (original)
+++ jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/launcher/VmsCommandLauncher.java Sat Mar 11 11:18:50 2006
@@ -26,6 +26,8 @@
 import java.util.Set;
 import java.util.Map.Entry;
 
+import org.apache.commons.exec.CommandLine;
+
 /**
  * A command launcher for VMS that writes the command to a temporary DCL script
  * before launching commands. This is due to limitations of both the DCL
@@ -36,10 +38,10 @@
     /**
      * Launches the given command in a new process.
      */
-    public Process exec(final String[] cmd, final Map env)
+    public Process exec(final CommandLine cmd, final Map env)
             throws IOException {
-        String[] vmsCmd = new String[1];
-        vmsCmd[0] = createCommandFile(cmd, env).getPath();
+        CommandLine vmsCmd = new CommandLine();
+        vmsCmd.setExecutable(createCommandFile(cmd, env).getPath());
 
         return super.exec(vmsCmd, env);
     }
@@ -50,10 +52,10 @@
      * only works if <code>workingDir</code> is null or the logical
      * JAVA$FORK_SUPPORT_CHDIR needs to be set to TRUE.
      */
-    public Process exec(final String[] cmd, final Map env,
+    public Process exec(final CommandLine cmd, final Map env,
             final File workingDir) throws IOException {
-        String[] vmsCmd = new String[1];
-        vmsCmd[0] = createCommandFile(cmd, env).getPath();
+        CommandLine vmsCmd = new CommandLine();
+        vmsCmd.setExecutable(createCommandFile(cmd, env).getPath());
 
         return super.exec(vmsCmd, env, workingDir);
     }
@@ -62,9 +64,9 @@
      * Writes the command into a temporary DCL script and returns the
      * corresponding File object. The script will be deleted on exit.
      */
-    private File createCommandFile(final String[] cmd, final Map env)
+    private File createCommandFile(final CommandLine cmd, final Map env)
             throws IOException {
-        File script = File.createTempFile("EXEC", ".COM");
+        File script = File.createTempFile("ANT", ".COM");
         script.deleteOnExit();
         PrintWriter out = null;
         try {
@@ -84,15 +86,11 @@
                 }
             }
 
-            if(cmd.length == 0) {
-            	throw new IOException("Can not execute empty command");
-            } else {
-	            out.print("$ " + cmd[0]);
-	
-	            for (int i = 1; i < cmd.length; i++) {
-	                out.println(" -");
-	                out.print(cmd[i]);
-	            }
+            out.print("$ " + cmd.getExecutable());
+            String[] args = cmd.getArguments();
+            for (int i = 0; i < args.length; i++) {
+                out.println(" -");
+                out.print(args[i]);
             }
         } finally {
             if (out != null) {

Modified: jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/launcher/WinNTCommandLauncher.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/launcher/WinNTCommandLauncher.java?rev=385141&r1=385140&r2=385141&view=diff
==============================================================================
--- jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/launcher/WinNTCommandLauncher.java (original)
+++ jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/launcher/WinNTCommandLauncher.java Sat Mar 11 11:18:50 2006
@@ -21,6 +21,8 @@
 import java.io.IOException;
 import java.util.Map;
 
+import org.apache.commons.exec.CommandLine;
+
 /**
  * A command launcher for Windows XP/2000/NT that uses 'cmd.exe' when launching
  * commands in directories other than the current working directory.
@@ -43,7 +45,7 @@
      * @throws IOException
      *             forwarded from the exec method of the command launcher
      */
-    public Process exec(final String[] cmd, final Map env,
+    public Process exec(final CommandLine cmd, final Map env,
             final File workingDir) throws IOException {
         if (workingDir == null) {
             return exec(cmd, env);
@@ -51,15 +53,10 @@
 
         // Use cmd.exe to change to the specified directory before running
         // the command
-        // TODO add code for switching to working dir
-        
-        String[] newCmd = new String[cmd.length + 2];
-        newCmd[0] = "cmd";
-        newCmd[1] = "/c";
-
-        for (int i = 0; i < cmd.length; i++) {
-			newCmd[i + 2] = cmd[i];
-		}
+        CommandLine newCmd = new CommandLine();
+        newCmd.setExecutable("cmd");
+        newCmd.addArgument("/c");
+        newCmd.addArguments(cmd.getCommandline());
 
         return exec(newCmd, env);
     }

Copied: jakarta/commons/sandbox/exec/trunk/src/test/java/org/apache/commons/exec/CommandLineTest.java (from r377093, jakarta/commons/sandbox/exec/trunk/src/test/java/org/apache/commons/exec/CommandLineTest.java)
URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/exec/trunk/src/test/java/org/apache/commons/exec/CommandLineTest.java?p2=jakarta/commons/sandbox/exec/trunk/src/test/java/org/apache/commons/exec/CommandLineTest.java&p1=jakarta/commons/sandbox/exec/trunk/src/test/java/org/apache/commons/exec/CommandLineTest.java&r1=377093&r2=385141&rev=385141&view=diff
==============================================================================
--- jakarta/commons/sandbox/exec/trunk/src/test/java/org/apache/commons/exec/CommandLineTest.java (original)
+++ jakarta/commons/sandbox/exec/trunk/src/test/java/org/apache/commons/exec/CommandLineTest.java Sat Mar 11 11:18:50 2006
@@ -22,13 +22,13 @@
 public class CommandLineTest extends TestCase {
 
     public void testSetExecutable() {
-        CommandLine cmdl = new CommandLineImpl();
+        CommandLine cmdl = new CommandLine();
         cmdl.setExecutable("test");
         assertEquals("test", cmdl.toString());
     }
 
     public void testSetArguments() {
-        CommandLine cmdl = new CommandLineImpl();
+        CommandLine cmdl = new CommandLine();
         cmdl.setExecutable("test");
         cmdl.addArgument("foo");
         cmdl.addArgument("bar");
@@ -36,7 +36,7 @@
     }
 
     public void testSetArgumentsWithSpace() {
-        CommandLine cmdl = new CommandLineImpl();
+        CommandLine cmdl = new CommandLine();
         cmdl.setExecutable("test");
         cmdl.addArgument("foo");
         cmdl.addArgument("ba r");
@@ -44,7 +44,7 @@
     }
 
     public void testSetArgumentsWithQuote() {
-        CommandLine cmdl = new CommandLineImpl();
+        CommandLine cmdl = new CommandLine();
         cmdl.setExecutable("test");
         cmdl.addArgument("foo");
         cmdl.addArgument("ba\"r");
@@ -52,7 +52,7 @@
     }
 
     public void testSetArgumentsWithSingleQuote() {
-        CommandLine cmdl = new CommandLineImpl();
+        CommandLine cmdl = new CommandLine();
         cmdl.setExecutable("test");
         cmdl.addArgument("foo");
         cmdl.addArgument("ba'r");

Modified: jakarta/commons/sandbox/exec/trunk/src/test/java/org/apache/commons/exec/ExecTest.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/exec/trunk/src/test/java/org/apache/commons/exec/ExecTest.java?rev=385141&r1=385140&r2=385141&view=diff
==============================================================================
--- jakarta/commons/sandbox/exec/trunk/src/test/java/org/apache/commons/exec/ExecTest.java (original)
+++ jakarta/commons/sandbox/exec/trunk/src/test/java/org/apache/commons/exec/ExecTest.java Sat Mar 11 11:18:50 2006
@@ -18,7 +18,6 @@
 package org.apache.commons.exec;
 
 import java.io.ByteArrayOutputStream;
-import java.io.File;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -37,7 +36,8 @@
     public void testExecute() throws Exception {
         Exec exec = new Exec();
 
-        String[] cl = new String[]{new File(testScript).getAbsolutePath()};
+        CommandLine cl = new CommandLine();
+        cl.setExecutable(testScript);
 
         exec.execute(cl, baos, baos);
 
@@ -47,7 +47,9 @@
     public void testExecuteWithArg() throws Exception {
         Exec exec = new Exec();
 
-        String[] cl = new String[]{testScript, "BAR"};
+        CommandLine cl = new CommandLine();
+        cl.setExecutable(testScript);
+        cl.addArgument("BAR");
         exec.execute(cl, baos, baos);
 
         assertEquals("FOO..BAR", baos.toString().trim());
@@ -57,7 +59,8 @@
         Map env = new HashMap();
         env.put("TEST_ENV_VAR", "XYZ");
 
-        String[] cl = new String[]{testScript};
+        CommandLine cl = new CommandLine();
+        cl.setExecutable(testScript);
 
         Exec exec = new Exec();
 

Modified: jakarta/commons/sandbox/exec/trunk/src/test/java/org/apache/commons/exec/TestUtil.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/exec/trunk/src/test/java/org/apache/commons/exec/TestUtil.java?rev=385141&r1=385140&r2=385141&view=diff
==============================================================================
--- jakarta/commons/sandbox/exec/trunk/src/test/java/org/apache/commons/exec/TestUtil.java (original)
+++ jakarta/commons/sandbox/exec/trunk/src/test/java/org/apache/commons/exec/TestUtil.java Sat Mar 11 11:18:50 2006
@@ -17,7 +17,6 @@
 
 package org.apache.commons.exec;
 
-import java.io.File;
 import java.util.Arrays;
 
 import junit.framework.AssertionFailedError;
@@ -29,17 +28,13 @@
     }
 
     public static String resolveScriptForOS(String script) {
-    	String scriptFileName;
-    	
         if (OS.isFamilyWindows()) {
-        	scriptFileName = script + ".bat";
+            return script + ".bat";
         } else if (OS.isFamilyUnix()) {
-        	scriptFileName = script + ".sh";
+            return script + ".sh";
         } else {
             throw new AssertionFailedError("Test not supported for this OS");
         }
-        
-        return new File(scriptFileName).getAbsolutePath();
     }
     
     



---------------------------------------------------------------------
To unsubscribe, e-mail: commons-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-dev-help@jakarta.apache.org