1 package org.eclipse.jetty.start;
2
3 import java.util.ArrayList;
4 import java.util.List;
5
6 public class CommandLineBuilder
7 {
8 private List<String> args;
9
10 public CommandLineBuilder(String bin)
11 {
12 args = new ArrayList<String>();
13 args.add(bin);
14 }
15
16 /**
17 * Add a simple argument to the command line.
18 * <p>
19 * Will quote arguments that have a space in them.
20 *
21 * @param arg
22 * the simple argument to add
23 */
24 public void addArg(String arg)
25 {
26 args.add(quote(arg));
27 }
28
29 /**
30 * Similar to {@link #addArg(String)} but concats both name + value with an "=" sign, quoting were needed, and excluding the "=" portion if the value is
31 * undefined or empty.
32 * <p>
33 *
34 * <pre>
35 * addEqualsArg("-Dname", "value") = "-Dname=value"
36 * addEqualsArg("-Djetty.home", "/opt/company inc/jetty (7)/") = "-Djetty.home=/opt/company\ inc/jetty\ (7)/"
37 * addEqualsArg("-Djenkins.workspace", "/opt/workspaces/jetty jdk7/") = "-Djenkins.workspace=/opt/workspaces/jetty\ jdk7/"
38 * addEqualsArg("-Dstress", null) = "-Dstress"
39 * addEqualsArg("-Dstress", "") = "-Dstress"
40 * </pre>
41 *
42 * @param name
43 * the name
44 * @param value
45 * the value
46 */
47 public void addEqualsArg(String name, String value)
48 {
49 if (value != null && value.length() > 0)
50 {
51 args.add(quote(name + "=" + value));
52 }
53 else
54 {
55 args.add(quote(name));
56 }
57 }
58
59 /**
60 * Add a simple argument to the command line.
61 * <p>
62 * Will <b>NOT</b> quote/escape arguments that have a space in them.
63 *
64 * @param arg
65 * the simple argument to add
66 */
67 public void addRawArg(String arg)
68 {
69 args.add(arg);
70 }
71
72 public List<String> getArgs()
73 {
74 return args;
75 }
76
77 /**
78 * Perform an optional quoting of the argument, being intelligent with spaces and quotes as needed.
79 *
80 * @param arg
81 * @return
82 */
83 public static String quote(String arg)
84 {
85 boolean needsQuoting = arg.indexOf(' ') >= 0 || arg.indexOf('"') >= 0;
86 if (!needsQuoting)
87 {
88 return arg;
89 }
90 StringBuilder buf = new StringBuilder();
91 // buf.append('"');
92 boolean escaped = false;
93 for (char c : arg.toCharArray())
94 {
95 if (!escaped && ((c == '"') || (c == ' ')))
96 {
97 buf.append("\\");
98 }
99 escaped = (c == '\\');
100 buf.append(c);
101 }
102 // buf.append('"');
103 return buf.toString();
104 }
105
106 @Override
107 public String toString()
108 {
109 StringBuilder buf = new StringBuilder();
110
111 boolean delim = false;
112 for (String arg : args)
113 {
114 if (delim)
115 {
116 buf.append(' ');
117 }
118 buf.append(arg);
119 delim = true;
120 }
121
122 return buf.toString();
123 }
124 }