View Javadoc

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 }