ArgumentListBuilder.java 2.7 KB
Newer Older
K
kohsuke 已提交
1 2 3 4 5
package hudson.util;

import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
K
kohsuke 已提交
6
import java.util.Arrays;
K
kohsuke 已提交
7 8
import java.util.Map;
import java.util.Map.Entry;
9
import java.io.Serializable;
K
kohsuke 已提交
10 11 12 13 14 15

/**
 * Used to build up arguments for a process invocation.
 *
 * @author Kohsuke Kawaguchi
 */
16
public class ArgumentListBuilder implements Serializable {
K
kohsuke 已提交
17 18
    private final List<String> args = new ArrayList<String>();

19 20 21 22
    public ArgumentListBuilder add(Object a) {
        return add(a.toString());
    }

K
kohsuke 已提交
23
    public ArgumentListBuilder add(String a) {
24 25
        if(a!=null)
            args.add(a);
K
kohsuke 已提交
26 27 28
        return this;
    }

K
kohsuke 已提交
29 30 31 32 33
    public ArgumentListBuilder prepend(String... args) {
        this.args.addAll(0, Arrays.asList(args));
        return this;
    }

K
kohsuke 已提交
34 35 36 37 38
    /**
     * Adds an argument by quoting it.
     * This is necessary only in a rare circumstance,
     * such as when adding argument for ssh and rsh.
     *
K
kohsuke 已提交
39
     * Normal process invocations don't need it, because each
K
kohsuke 已提交
40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
     * argument is treated as its own string and never merged into one. 
     */
    public ArgumentListBuilder addQuoted(String a) {
        return add('"'+a+'"');
    }

    public ArgumentListBuilder add(String... args) {
        for (String arg : args) {
            add(arg);
        }
        return this;
    }

    /**
     * Decomposes the given token into multiple arguments by splitting via whitespace.
     */
    public ArgumentListBuilder addTokenized(String s) {
K
kohsuke 已提交
57
        if(s==null) return this;
K
kohsuke 已提交
58 59 60 61 62 63
        StringTokenizer tokens = new StringTokenizer(s);
        while(tokens.hasMoreTokens())
            add(tokens.nextToken());
        return this;
    }

K
kohsuke 已提交
64 65 66 67 68 69 70 71 72 73 74 75
    /**
     * Adds key value pairs as "-Dkey=value -Dkey=value"...
     *
     * <tt>-D</tt> portion is configurable.
     * @since 1.114
     */
    public ArgumentListBuilder addKeyValuePairs(String prefix, Map<String,String> props) {
        for (Entry<String,String> e : props.entrySet())
            add(prefix+e.getKey()+'='+e.getValue());
        return this;
    }

K
kohsuke 已提交
76 77 78
    public String[] toCommandArray() {
        return args.toArray(new String[args.size()]);
    }
K
kohsuke 已提交
79 80 81 82 83 84
    
    public ArgumentListBuilder clone() {
        ArgumentListBuilder r = new ArgumentListBuilder();
        r.args.addAll(this.args);
        return r;
    }
K
kohsuke 已提交
85 86 87 88

    public List<String> toList() {
        return args;
    }
89 90 91 92 93 94 95 96 97 98 99 100 101

    public String toStringWithQuote() {
        StringBuilder buf = new StringBuilder();
        for (String arg : args) {
            if(buf.length()>0)  buf.append(' ');

            if(arg.indexOf(' ')>=0 || arg.length()==0)
                buf.append('"').append(arg).append('"');
            else
                buf.append(arg);
        }
        return buf.toString();
    }
102 103

    private static final long serialVersionUID = 1L;
K
kohsuke 已提交
104
}